gmenus.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. /*
  2. GMenus Include (gmenus.inc)
  3. * I am good in textdraws and here i represent you my unique menus include.
  4. * Scheme similar to GTA SA menus but design relevant to GTA V!
  5. * And customizable per player!
  6. Author: (creator)
  7. * Gammix
  8. (c) Copyright 2015
  9. * This file is provided as is (no warranties).
  10. */
  11. /*
  12. FUNCTIONS:
  13. native Menu_Create(title[], headercolor = -1);
  14. native Menu_IsValid(menuid);
  15. native Menu_Destroy(menuid);
  16. native Menu_AddItem(menuid, itemtext[]);
  17. native Menu_EditItem(menuid, itemid, itemtext[]);
  18. native Menu_EditTitle(menuid, newtitle[]);
  19. native Menu_Show(playerid, menuid, selectioncolor = 0x0000AAFF, bool:showitemid = true);
  20. native Menu_Hide(playerid);
  21. native _
  22. native GetPlayerMenuID(playerid);
  23. native GetPlayerMenuLisitemID(playerid);
  24. CALLBACKS:
  25. public OnMenuResponse(playerid, menuid, response, listitem)
  26. */
  27. #define MAX_G_MENUS 10 //maximum menus your script can have
  28. #define MAX_MENU_ITEMS 25 //maximum listitems a menu can have
  29. #define MAX_MENU_PAGE_ITEMS 10 //maximum lines/lisitems shown in a menu's single page
  30. #define INVALID_MENU_ID -1 //not to change
  31. #define MENU_RESPONSE_UP 0 //when a player press KEY_UP and select the previous item
  32. #define MENU_RESPONSE_DOWN 1 //when a player press KEY_DOWN and select the next item
  33. #define MENU_RESPONSE_CLOSE 2 //when a player press KEY_SECONDARY_ATTACK or KEY_ENTER to exit the menu
  34. #define MENU_RESPONSE_SELECT 3 //when a player press KEY_SPRINT ot KEY_SPACE to select the respected item
  35. #define MENU_SOUND_UP 1054 //sound heard when player go UP
  36. #define MENU_SOUND_DOWN 1054 //sound heard when player go DOWN
  37. #define MENU_SOUND_CLOSE 1084 //sound heard when player close menu
  38. #define MENU_SOUND_SELECT 1083 //sound heard when player select an item
  39. enum PlayerMenuEnum
  40. {
  41. PM_MENUID,
  42. PM_LISTITEM,
  43. PM_LISTITEM_FIRST,
  44. PM_LISTITEM_LAST,
  45. PM_SELECTION_COLOR,
  46. PM_TICK,
  47. bool:PM_SHOW_ITEM_ID
  48. }
  49. static gPlayerMenu[MAX_PLAYERS][PlayerMenuEnum];
  50. enum MenuEnum
  51. {
  52. bool:M_EXIST,
  53. M_HEADER[18],
  54. M_LISTITEMS,
  55. M_HEADER_COLOR,
  56. }
  57. static gMenu[MAX_G_MENUS][MenuEnum];
  58. static gMenuItems[MAX_G_MENUS][MAX_MENU_ITEMS][35];
  59. static Text:gMenuGlobalTD[2];
  60. static PlayerText:gMenuPlayerItemsTD[MAX_PLAYERS][MAX_MENU_PAGE_ITEMS];
  61. static PlayerText:gMenuPlayerTD[MAX_PLAYERS][2];
  62. //internal functions
  63. stock static MENU_iseven(num)
  64. {
  65. new r = (num % 2);
  66. if(r > 0) return true;
  67. return false;
  68. }
  69. stock static MENU_isnegative(num)
  70. {
  71. if(num < 0) return true;
  72. return false;
  73. }
  74. stock static MENU_SetTransparency(color, alpha = 0xFF)
  75. {
  76. static newcolor;
  77. alpha = clamp(alpha, 0x00, 0xFF);
  78. newcolor = (color & ~0xFF) | alpha;
  79. return newcolor;
  80. }
  81. stock static Text:MENU_TextDrawAdd(Float:posX, Float:posY, string[], bgcolor, font, Float:lettersizeX, Float:lettersizeY, textcolor, allign = 0, outline = 1, bool:proportional = true, shadow = 1, bool:usebox = false, boxcolor = 0, Float:textsizeX = -1.0, Float:textsizeY = -1.0, model = 0, Float:rotX = 0.0, Float:rotY = 0.0, Float:rotZ = 0.0, Float:zoom = 1.0)
  82. {
  83. static Text:gTextDraw;
  84. gTextDraw = TextDrawCreate(posX, posY, string);
  85. TextDrawBackgroundColor(gTextDraw, bgcolor);
  86. TextDrawFont(gTextDraw, font);
  87. TextDrawLetterSize(gTextDraw, lettersizeX, lettersizeY);
  88. TextDrawColor(gTextDraw, textcolor);
  89. TextDrawAlignment(gTextDraw, allign);
  90. TextDrawSetOutline(gTextDraw, outline);
  91. TextDrawSetProportional(gTextDraw, proportional);
  92. TextDrawSetShadow(gTextDraw, shadow);
  93. TextDrawUseBox(gTextDraw, usebox);
  94. if(usebox) TextDrawBoxColor(gTextDraw, boxcolor);
  95. if(textsizeX != -1.0 && textsizeY != -1.0) TextDrawTextSize(gTextDraw, textsizeX, textsizeY);
  96. if(font == 5)
  97. {
  98. TextDrawSetPreviewModel(gTextDraw, model);
  99. TextDrawSetPreviewRot(gTextDraw, rotX, rotY, rotZ, zoom);
  100. }
  101. return gTextDraw;
  102. }
  103. stock static PlayerText:MENU_PlayerTextDrawAdd(playerid, Float:posX, Float:posY, string[], bgcolor, font, Float:lettersizeX, Float:lettersizeY, textcolor, allign = 0, outline = 1, bool:proportional = true, shadow = 1, bool:usebox = false, boxcolor = 0, Float:textsizeX = -1.0, Float:textsizeY = -1.0, model = 0, Float:rotX = 0.0, Float:rotY = 0.0, Float:rotZ = 0.0, Float:zoom = 1.0, selectable = 0)
  104. {
  105. static PlayerText:gTextDraw;
  106. gTextDraw = CreatePlayerTextDraw(playerid, posX, posY, string);
  107. PlayerTextDrawBackgroundColor(playerid, gTextDraw, bgcolor);
  108. PlayerTextDrawFont(playerid, gTextDraw, font);
  109. PlayerTextDrawLetterSize(playerid, gTextDraw, lettersizeX, lettersizeY);
  110. PlayerTextDrawColor(playerid, gTextDraw, textcolor);
  111. PlayerTextDrawAlignment(playerid, gTextDraw, allign);
  112. PlayerTextDrawSetOutline(playerid, gTextDraw, outline);
  113. PlayerTextDrawSetProportional(playerid, gTextDraw, proportional);
  114. PlayerTextDrawSetShadow(playerid, gTextDraw, shadow);
  115. PlayerTextDrawUseBox(playerid, gTextDraw, usebox);
  116. if(usebox) PlayerTextDrawBoxColor(playerid, gTextDraw, boxcolor);
  117. if(textsizeX != -1.0 && textsizeY != -1.0) PlayerTextDrawTextSize(playerid, gTextDraw, textsizeX, textsizeY);
  118. if(font == 5)
  119. {
  120. PlayerTextDrawSetPreviewModel(playerid, gTextDraw, model);
  121. PlayerTextDrawSetPreviewRot(playerid, gTextDraw, rotX, rotY, rotZ, zoom);
  122. }
  123. PlayerTextDrawSetSelectable(playerid, gTextDraw, selectable);
  124. return gTextDraw;
  125. }
  126. static Menu_CreateGlobalTDs()
  127. {
  128. gMenuGlobalTD[0] = MENU_TextDrawAdd(20.000000, 158.000000, "header", 255, 1, 0.000000, 3.000000, -1, 1, 0, true, 1, true, 1678379670, 150.000000, 0.000000);
  129. gMenuGlobalTD[1] = MENU_TextDrawAdd(20.000000, 191.000000, "Menu", 255, 1, 0.150000, 0.599999, -1, 1, 0, true, 1, true, 169090710, 150.000000, 0.000000);
  130. return true;
  131. }
  132. static Menu_DestroyGlobalTDs()
  133. {
  134. TextDrawDestroy(gMenuGlobalTD[0]);
  135. TextDrawDestroy(gMenuGlobalTD[1]);
  136. return true;
  137. }
  138. //Note: if you use this in a filterscript, please define "FILTERSCRIPT" in your script
  139. #if defined FILTERSCRIPT// if used in a filterscript
  140. public OnFilterScriptInit()
  141. {
  142. Menu_CreateGlobalTDs();
  143. for(new i; i < MAX_G_MENUS; i++) gMenu[i][M_EXIST] = false;
  144. return CallLocalFunction("MENU_OnFilterScriptInit", "");
  145. }
  146. #if defined _ALS_OnFilterScriptInit
  147. #undef OnFilterScriptInit
  148. #else
  149. #define _ALS_OnFilterScriptInit
  150. #endif
  151. #define OnFilterScriptInit MENU_OnFilterScriptInit
  152. forward MENU_OnFilterScriptInit();
  153. public OnFilterScriptExit()
  154. {
  155. Menu_DestroyGlobalTDs();
  156. return CallLocalFunction("MENU_OnFilterScriptExit", "");
  157. }
  158. #if defined _ALS_OnFilterScriptExit
  159. #undef OnFilterScriptExit
  160. #else
  161. #define _ALS_OnFilterScriptExit
  162. #endif
  163. #define OnFilterScriptExit MENU_OnFilterScriptExit
  164. forward MENU_OnFilterScriptExit();
  165. #else// if used in a gamemode
  166. public OnGameModeInit()
  167. {
  168. Menu_CreateGlobalTDs();
  169. for(new i; i < MAX_G_MENUS; i++) gMenu[i][M_EXIST] = false;
  170. return CallLocalFunction("MENU_OnGameModeInit", "");
  171. }
  172. #if defined _ALS_OnGameModeInit
  173. #undef OnGameModeInit
  174. #else
  175. #define _ALS_OnGameModeInit
  176. #endif
  177. #define OnGameModeInit MENU_OnGameModeInit
  178. forward MENU_OnGameModeInit();
  179. public OnGameModeExit()
  180. {
  181. Menu_DestroyGlobalTDs();
  182. return CallLocalFunction("MENU_OnGameModeExit", "");
  183. }
  184. #if defined _ALS_OnGameModeExit
  185. #undef OnGameModeExit
  186. #else
  187. #define _ALS_OnGameModeExit
  188. #endif
  189. #define OnGameModeExit MENU_OnGameModeExit
  190. forward MENU_OnGameModeExit();
  191. #endif
  192. stock Menu_Create(title[], headercolor = -1)
  193. {
  194. for(new i; i < MAX_G_MENUS; i++)
  195. {
  196. if(! gMenu[i][M_EXIST])
  197. {
  198. gMenu[i][M_EXIST] = true;
  199. format(gMenu[i][M_HEADER], 18, title);
  200. gMenu[i][M_LISTITEMS] = 0;
  201. gMenu[i][M_HEADER_COLOR] = headercolor;
  202. for(new x; x < MAX_MENU_ITEMS; x++) format(gMenuItems[i][x], 35, "");
  203. return i;
  204. }
  205. }
  206. return -1;
  207. }
  208. stock Menu_IsValid(menuid)
  209. {
  210. return gMenu[menuid][M_EXIST];
  211. }
  212. stock Menu_Destroy(menuid)
  213. {
  214. gMenu[menuid][M_EXIST] = false;
  215. for(new i; i < MAX_PLAYERS; i++)
  216. {
  217. if( IsPlayerConnected(i) &&
  218. GetPlayerMenuID(i) == menuid)
  219. {
  220. Menu_Hide(i);
  221. }
  222. }
  223. return true;
  224. }
  225. stock Menu_AddItem(menuid, itemtext[])
  226. {
  227. new index = (gMenu[menuid][M_LISTITEMS] + 1);
  228. if(index > MAX_MENU_ITEMS) return -1;
  229. index -= 1;
  230. format(gMenuItems[menuid][index], 35, itemtext);
  231. gMenu[menuid][M_LISTITEMS] += 1;
  232. return index;
  233. }
  234. stock Menu_EditItem(menuid, itemid, itemtext[])
  235. {
  236. if(itemid > MAX_MENU_ITEMS) return false;
  237. format(gMenuItems[menuid][itemid], 35, itemtext);
  238. for(new i; i < MAX_PLAYERS; i++)
  239. {
  240. if( IsPlayerConnected(i) &&
  241. GetPlayerMenuID(i) == menuid)
  242. {
  243. if(gPlayerMenu[i][PM_LISTITEM_FIRST] <= itemid <= gPlayerMenu[i][PM_LISTITEM_LAST])
  244. {
  245. new index = (itemid - gPlayerMenu[i][PM_LISTITEM_FIRST]);
  246. PlayerTextDrawSetString(i, gMenuPlayerItemsTD[i][index], itemtext);
  247. }
  248. }
  249. }
  250. return true;
  251. }
  252. stock Menu_EditTitle(menuid, newtitle[])
  253. {
  254. format(gMenu[menuid][M_HEADER], 18, newtitle);
  255. for(new i; i < MAX_PLAYERS; i++)
  256. {
  257. if( IsPlayerConnected(i) &&
  258. GetPlayerMenuID(i) == menuid)
  259. {
  260. PlayerTextDrawSetString(i, gMenuPlayerTD[i][0], newtitle);
  261. }
  262. }
  263. return true;
  264. }
  265. stock Menu_Show(playerid, menuid, selectioncolor = 0x0000AAFF, bool:showitemid = true)
  266. {
  267. if(! Menu_IsValid(menuid)) return false;
  268. if(gMenu[menuid][M_LISTITEMS] < 1) return false;
  269. if(GetPlayerMenuID(playerid) != INVALID_MENU_ID) Menu_Hide(playerid);
  270. gPlayerMenu[playerid][PM_MENUID] = menuid;
  271. gPlayerMenu[playerid][PM_LISTITEM] = 0;
  272. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = 0;
  273. gPlayerMenu[playerid][PM_SELECTION_COLOR] = selectioncolor;
  274. gPlayerMenu[playerid][PM_SHOW_ITEM_ID] = showitemid;
  275. TextDrawColor(gMenuGlobalTD[0], gMenu[menuid][M_HEADER_COLOR]);
  276. TextDrawShowForPlayer(playerid, gMenuGlobalTD[0]);
  277. new Float:MENU_BASE_X = 20.000000;
  278. new Float:MENU_BASE_Y = 202.000000;
  279. if(! showitemid)
  280. {
  281. MENU_BASE_X = 20.000000;
  282. MENU_BASE_Y = 191.000000;
  283. }
  284. for(new i = 0; i < MAX_MENU_PAGE_ITEMS; i++)
  285. {
  286. if(i > gMenu[menuid][M_LISTITEMS]) break;
  287. if(! strlen(gMenuItems[menuid][i])) continue;
  288. if(MENU_iseven(i))
  289. {
  290. gMenuPlayerItemsTD[playerid][i] = MENU_PlayerTextDrawAdd(playerid, MENU_BASE_X, MENU_BASE_Y + (i * 10), gMenuItems[menuid][i], 255, 1, 0.150000, 0.599999, -1, 1, 0, true, 1, true, 150, 150.000000, 0.000000);
  291. if(i == 0) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][i], MENU_SetTransparency(selectioncolor, 150));
  292. }
  293. else
  294. {
  295. gMenuPlayerItemsTD[playerid][i] = MENU_PlayerTextDrawAdd(playerid, MENU_BASE_X, MENU_BASE_Y + (i * 10), gMenuItems[menuid][i], 255, 1, 0.150000, 0.599999, -1, 1, 0, true, 1, true, 100, 150.000000, 0.000000);
  296. if(i == 0) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][i], MENU_SetTransparency(selectioncolor, 100));
  297. }
  298. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][i]);
  299. gPlayerMenu[playerid][PM_LISTITEM_LAST] = i;
  300. }
  301. gMenuPlayerTD[playerid][0] = MENU_PlayerTextDrawAdd(playerid, 83.000000, 162.000000, gMenu[menuid][M_HEADER], 0, 1, 0.470000, 1.900000, -1, 2, 1, true);
  302. PlayerTextDrawShow(playerid, gMenuPlayerTD[playerid][0]);
  303. if(showitemid)
  304. {
  305. TextDrawShowForPlayer(playerid, gMenuGlobalTD[1]);
  306. new menustr[10];
  307. format(menustr, sizeof(menustr), "1/%i", gMenu[menuid][M_LISTITEMS]);
  308. gMenuPlayerTD[playerid][1] = MENU_PlayerTextDrawAdd(playerid, 149.000000, 189.000000, menustr, 255, 1, 0.170000, 0.800000, -1, 3, 0, true);
  309. PlayerTextDrawShow(playerid, gMenuPlayerTD[playerid][1]);
  310. }
  311. return true;
  312. }
  313. stock Menu_Hide(playerid)
  314. {
  315. if(GetPlayerMenuID(playerid) == INVALID_MENU_ID) return false;
  316. TextDrawHideForPlayer(playerid, gMenuGlobalTD[0]);
  317. for(new i = 0; i < MAX_MENU_PAGE_ITEMS; i++) PlayerTextDrawHide(playerid, gMenuPlayerItemsTD[playerid][i]), PlayerTextDrawDestroy(playerid, gMenuPlayerItemsTD[playerid][i]);
  318. PlayerTextDrawHide(playerid, gMenuPlayerTD[playerid][0]);
  319. PlayerTextDrawDestroy(playerid, gMenuPlayerTD[playerid][0]);
  320. if(gPlayerMenu[playerid][PM_SHOW_ITEM_ID])
  321. {
  322. TextDrawHideForPlayer(playerid, gMenuGlobalTD[1]);
  323. PlayerTextDrawHide(playerid, gMenuPlayerTD[playerid][1]);
  324. PlayerTextDrawDestroy(playerid, gMenuPlayerTD[playerid][1]);
  325. }
  326. gPlayerMenu[playerid][PM_MENUID] = INVALID_MENU_ID;
  327. gPlayerMenu[playerid][PM_LISTITEM] = 0;
  328. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = 0;
  329. gPlayerMenu[playerid][PM_LISTITEM_LAST] = 0;
  330. gPlayerMenu[playerid][PM_SELECTION_COLOR] = -1;
  331. gPlayerMenu[playerid][PM_TICK] = 0;
  332. gPlayerMenu[playerid][PM_SHOW_ITEM_ID] = false;
  333. return true;
  334. }
  335. stock GetPlayerMenuID(playerid)
  336. {
  337. return gPlayerMenu[playerid][PM_MENUID];
  338. }
  339. stock GetPlayerMenuLisitemID(playerid)
  340. {
  341. return gPlayerMenu[playerid][PM_LISTITEM];
  342. }
  343. public OnPlayerConnect(playerid)
  344. {
  345. gPlayerMenu[playerid][PM_MENUID] = INVALID_MENU_ID;
  346. gPlayerMenu[playerid][PM_LISTITEM] = 0;
  347. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = 0;
  348. gPlayerMenu[playerid][PM_LISTITEM_LAST] = 0;
  349. gPlayerMenu[playerid][PM_SELECTION_COLOR] = -1;
  350. gPlayerMenu[playerid][PM_TICK] = GetTickCount();
  351. return CallLocalFunction("MENU_OnPlayerConnect", "i", playerid);
  352. }
  353. #if defined _ALS_OnPlayerConnect
  354. #undef OnPlayerConnect
  355. #else
  356. #define _ALS_OnPlayerConnect
  357. #endif
  358. #define OnPlayerConnect MENU_OnPlayerConnect
  359. forward MENU_OnPlayerConnect(playerid);
  360. public OnPlayerUpdate(playerid)
  361. {
  362. if(GetPlayerMenuID(playerid) != INVALID_MENU_ID)
  363. {
  364. new keys, updown, leftright;
  365. GetPlayerKeys(playerid, keys, updown, leftright);
  366. if(updown == KEY_DOWN)
  367. {
  368. // only allow new selection every ~200 ms
  369. if((GetTickCount() - gPlayerMenu[playerid][PM_TICK]) < 200) return 1;
  370. gPlayerMenu[playerid][PM_TICK] = GetTickCount();
  371. new index = (gPlayerMenu[playerid][PM_LISTITEM] + 1);
  372. //if the player have reached the end of list/menu; Push the selection from begining
  373. if(index > (gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS] - 1))
  374. {
  375. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_DOWN, 0))
  376. {
  377. gPlayerMenu[playerid][PM_LISTITEM] = 0;
  378. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = 0;
  379. gPlayerMenu[playerid][PM_LISTITEM_LAST] = (0 + MAX_MENU_PAGE_ITEMS);
  380. PlayerPlaySound(playerid, MENU_SOUND_UP, 0.0, 0.0, 0.0);
  381. }
  382. else return 1;
  383. }
  384. //if the player have reached the end of page; push the player to next page!
  385. else if(index > gPlayerMenu[playerid][PM_LISTITEM_LAST])
  386. {
  387. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_DOWN, (gPlayerMenu[playerid][PM_LISTITEM_LAST] + 1)))
  388. {
  389. gPlayerMenu[playerid][PM_LISTITEM] = (gPlayerMenu[playerid][PM_LISTITEM_LAST] + 1);
  390. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = gPlayerMenu[playerid][PM_LISTITEM];
  391. gPlayerMenu[playerid][PM_LISTITEM_LAST] = (gPlayerMenu[playerid][PM_LISTITEM_FIRST] + MAX_MENU_PAGE_ITEMS);
  392. PlayerPlaySound(playerid, MENU_SOUND_UP, 0.0, 0.0, 0.0);
  393. }
  394. else return 1;
  395. }
  396. //if on the same list but requesting for next item; then highlight the next item !
  397. else
  398. {
  399. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_DOWN, (gPlayerMenu[playerid][PM_LISTITEM] + 1)))
  400. {
  401. index = (gPlayerMenu[playerid][PM_LISTITEM] - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  402. if(MENU_iseven(index)) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 150);
  403. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 100);
  404. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  405. gPlayerMenu[playerid][PM_LISTITEM] += 1;//+
  406. index = (gPlayerMenu[playerid][PM_LISTITEM] - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  407. if(gPlayerMenu[playerid][PM_SHOW_ITEM_ID])
  408. {
  409. new menustr[10];
  410. format(menustr, sizeof(menustr), "%i/%i", (gPlayerMenu[playerid][PM_LISTITEM] + 1), gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS]);
  411. PlayerTextDrawSetString(playerid, gMenuPlayerTD[playerid][1], menustr);
  412. }
  413. if(MENU_iseven(index)) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 150));
  414. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 100));
  415. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  416. PlayerPlaySound(playerid, MENU_SOUND_UP, 0.0, 0.0, 0.0);
  417. }
  418. //end
  419. return 1;
  420. }
  421. //if the first 2 conditons apply (any one)
  422. for(new i = gPlayerMenu[playerid][PM_LISTITEM]; i < (gPlayerMenu[playerid][PM_LISTITEM] + MAX_MENU_PAGE_ITEMS); i++)
  423. {
  424. index = (i - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  425. if(i > gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS]) PlayerTextDrawHide(playerid, gMenuPlayerItemsTD[playerid][index]);
  426. else
  427. {
  428. PlayerTextDrawSetString(playerid, gMenuPlayerItemsTD[playerid][index], gMenuItems[GetPlayerMenuID(playerid)][i]);
  429. if(MENU_iseven(index))
  430. {
  431. if(i == gPlayerMenu[playerid][PM_LISTITEM]) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 150));
  432. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 150);
  433. }
  434. else
  435. {
  436. if(i == gPlayerMenu[playerid][PM_LISTITEM]) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 100));
  437. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 100);
  438. }
  439. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  440. if(gPlayerMenu[playerid][PM_SHOW_ITEM_ID])
  441. {
  442. new menustr[10];
  443. format(menustr, sizeof(menustr), "%i/%i", (gPlayerMenu[playerid][PM_LISTITEM] + 1), gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS]);
  444. PlayerTextDrawSetString(playerid, gMenuPlayerTD[playerid][1], menustr);
  445. }
  446. gPlayerMenu[playerid][PM_LISTITEM_LAST] = i;
  447. }
  448. }
  449. }
  450. else if(updown == KEY_UP)
  451. {
  452. // only allow new selection every ~200 ms
  453. if((GetTickCount() - gPlayerMenu[playerid][PM_TICK]) < 200) return 1;
  454. gPlayerMenu[playerid][PM_TICK] = GetTickCount();
  455. new index = (gPlayerMenu[playerid][PM_LISTITEM] - 1);
  456. //if the player have reached the first item of first page, then stop updating menu!
  457. if(MENU_isnegative(index))
  458. {
  459. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_UP, gPlayerMenu[playerid][PM_LISTITEM]))
  460. {
  461. PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
  462. }
  463. else return 1;
  464. return 1;
  465. }
  466. //if the player have reached the first item of page; push the player to previous page!
  467. else if(index < gPlayerMenu[playerid][PM_LISTITEM_FIRST])
  468. {
  469. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_UP, (gPlayerMenu[playerid][PM_LISTITEM_FIRST] - 1)))
  470. {
  471. gPlayerMenu[playerid][PM_LISTITEM] = (gPlayerMenu[playerid][PM_LISTITEM_FIRST] - 1);
  472. gPlayerMenu[playerid][PM_LISTITEM_FIRST] = ((gPlayerMenu[playerid][PM_LISTITEM] + 1) - MAX_MENU_PAGE_ITEMS);
  473. gPlayerMenu[playerid][PM_LISTITEM_LAST] = gPlayerMenu[playerid][PM_LISTITEM];
  474. PlayerPlaySound(playerid, MENU_SOUND_DOWN, 0.0, 0.0, 0.0);
  475. }
  476. }
  477. //if on the same list but requesting for next item; then highlight the next item !
  478. else
  479. {
  480. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_UP, (gPlayerMenu[playerid][PM_LISTITEM] - 1)))
  481. {
  482. index = (gPlayerMenu[playerid][PM_LISTITEM] - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  483. if(MENU_iseven(index)) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 150);
  484. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 100);
  485. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  486. gPlayerMenu[playerid][PM_LISTITEM] -= 1;//-
  487. index = (gPlayerMenu[playerid][PM_LISTITEM] - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  488. if(gPlayerMenu[playerid][PM_SHOW_ITEM_ID])
  489. {
  490. new menustr[10];
  491. format(menustr, sizeof(menustr), "%i/%i", (gPlayerMenu[playerid][PM_LISTITEM] + 1), gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS]);
  492. PlayerTextDrawSetString(playerid, gMenuPlayerTD[playerid][1], menustr);
  493. }
  494. if(MENU_iseven(index)) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 150));
  495. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 100));
  496. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  497. PlayerPlaySound(playerid, MENU_SOUND_DOWN, 0.0, 0.0, 0.0);
  498. }
  499. //end
  500. return 1;
  501. }
  502. //if the first conditon apply (any one)
  503. for(new i = gPlayerMenu[playerid][PM_LISTITEM]; i > (gPlayerMenu[playerid][PM_LISTITEM] - MAX_MENU_PAGE_ITEMS); i--)
  504. {
  505. index = (i - gPlayerMenu[playerid][PM_LISTITEM_FIRST]);
  506. PlayerTextDrawSetString(playerid, gMenuPlayerItemsTD[playerid][index], gMenuItems[GetPlayerMenuID(playerid)][i]);
  507. if(MENU_iseven(index))
  508. {
  509. if(i == gPlayerMenu[playerid][PM_LISTITEM]) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 150));
  510. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 150);
  511. }
  512. else
  513. {
  514. if(i == gPlayerMenu[playerid][PM_LISTITEM]) PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], MENU_SetTransparency(gPlayerMenu[playerid][PM_SELECTION_COLOR], 100));
  515. else PlayerTextDrawBoxColor(playerid, gMenuPlayerItemsTD[playerid][index], 100);
  516. }
  517. PlayerTextDrawShow(playerid, gMenuPlayerItemsTD[playerid][index]);
  518. if(gPlayerMenu[playerid][PM_SHOW_ITEM_ID])
  519. {
  520. new menustr[10];
  521. format(menustr, sizeof(menustr), "%i/%i", (gPlayerMenu[playerid][PM_LISTITEM] + 1), gMenu[GetPlayerMenuID(playerid)][M_LISTITEMS]);
  522. PlayerTextDrawSetString(playerid, gMenuPlayerTD[playerid][1], menustr);
  523. }
  524. }
  525. }
  526. if(keys == KEY_SECONDARY_ATTACK)
  527. {
  528. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_CLOSE, gPlayerMenu[playerid][PM_LISTITEM]))
  529. {
  530. Menu_Hide(playerid);
  531. PlayerPlaySound(playerid, MENU_SOUND_CLOSE, 0.0, 0.0, 0.0);
  532. }
  533. }
  534. else if(keys == KEY_SPRINT)
  535. {
  536. if(CallLocalFunction("OnMenuResponse", "iiii", playerid, GetPlayerMenuID(playerid), MENU_RESPONSE_SELECT, gPlayerMenu[playerid][PM_LISTITEM]))
  537. {
  538. Menu_Hide(playerid);
  539. PlayerPlaySound(playerid, MENU_SOUND_SELECT, 0.0, 0.0, 0.0);
  540. }
  541. }
  542. }
  543. return CallLocalFunction("MENU_OnPlayerUpdate", "i", playerid);
  544. }
  545. #if defined _ALS_OnPlayerUpdate
  546. #undef OnPlayerUpdate
  547. #else
  548. #define _ALS_OnPlayerUpdate
  549. #endif
  550. #define OnPlayerUpdate MENU_OnPlayerUpdate
  551. forward MENU_OnPlayerUpdate(playerid);
  552. forward OnMenuResponse(playerid, menuid, response, listitem);