1
0

a_menus.inc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include <a_samp>
  2. #define MAX_CUSTOM_MENUS 64
  3. #define MAX_MENU_ITEMS 24
  4. enum custom_menu_enum
  5. {
  6. menuTitle[64],
  7. Float:menuX,
  8. Float:menuY,
  9. Text:menuTD
  10. };
  11. new stock CustomMenuEnum[MAX_CUSTOM_MENUS + 1][custom_menu_enum];
  12. new stock CustomMenuItems[MAX_CUSTOM_MENUS + 1][MAX_MENU_ITEMS + 1][32];
  13. new stock Text:CustomMenuItemTextdraw[MAX_CUSTOM_MENUS + 1][MAX_MENU_ITEMS + 1];
  14. new stock CustomMenuItemCount[MAX_CUSTOM_MENUS + 1];
  15. new stock Float:CustomMenuY[MAX_CUSTOM_MENUS + 1];
  16. new stock CustomMenuCount;
  17. new stock MenuItemHandle[MAX_PLAYERS];
  18. new stock MenuHandle[MAX_PLAYERS];
  19. forward MenuUpdate(playerid, menuid);
  20. forward OnPlayerSelectMenuItem(playerid, menuid, itemid);
  21. stock CreateCustomMenu(title[], Float:x, Float:y, color = -1347440641)
  22. {
  23. if (CustomMenuCount == MAX_CUSTOM_MENUS)
  24. return printf("The menu limit of %d has been reached. Please raise MAX_CUSTOM_MENUS to a higher number.", MAX_CUSTOM_MENUS);
  25. CustomMenuCount += 1;
  26. CustomMenuEnum[CustomMenuCount][menuTD] = TextDrawCreate(x, y, title);
  27. TextDrawBackgroundColor(CustomMenuEnum[CustomMenuCount][menuTD], 255);
  28. TextDrawFont(CustomMenuEnum[CustomMenuCount][menuTD], 3);
  29. TextDrawLetterSize(CustomMenuEnum[CustomMenuCount][menuTD], 0.430, 1.5);
  30. TextDrawColor(CustomMenuEnum[CustomMenuCount][menuTD], -1);
  31. TextDrawSetOutline(CustomMenuEnum[CustomMenuCount][menuTD], 1);
  32. TextDrawSetProportional(CustomMenuEnum[CustomMenuCount][menuTD], 1);
  33. TextDrawUseBox(CustomMenuEnum[CustomMenuCount][menuTD], 1);
  34. TextDrawBoxColor(CustomMenuEnum[CustomMenuCount][menuTD], color);
  35. TextDrawTextSize(CustomMenuEnum[CustomMenuCount][menuTD], 444.0, 0.0);
  36. format(CustomMenuEnum[CustomMenuCount][menuTitle], 64, title);
  37. CustomMenuEnum[CustomMenuCount][menuX] = x;
  38. CustomMenuEnum[CustomMenuCount][menuY] = y;
  39. CustomMenuY[CustomMenuCount] = 138.0;
  40. return CustomMenuCount;
  41. }
  42. stock AddCustomMenuItem(menuid, itemname[], color = -1347440641)
  43. {
  44. if (CustomMenuItemCount[menuid] == MAX_MENU_ITEMS)
  45. return printf("The menu item limit of %d has been reached. Please raise MAX_MENU_ITEMS to a higher number.", MAX_MENU_ITEMS);
  46. CustomMenuItemCount[menuid] += 1;
  47. CustomMenuY[menuid] += 15.0;
  48. CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]] = TextDrawCreate(CustomMenuEnum[menuid][menuX], CustomMenuY[menuid], itemname);
  49. TextDrawBackgroundColor(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 255);
  50. TextDrawFont(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 1);
  51. TextDrawLetterSize(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 0.469, 1.50);
  52. TextDrawColor(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], -1);
  53. TextDrawSetOutline(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 1);
  54. TextDrawSetProportional(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 1);
  55. TextDrawUseBox(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 1);
  56. TextDrawBoxColor(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], color);
  57. TextDrawTextSize(CustomMenuItemTextdraw[menuid][CustomMenuItemCount[menuid]], 444.0, 0.0);
  58. format(CustomMenuItems[menuid][CustomMenuItemCount[menuid]], 32, itemname);
  59. return 1;
  60. }
  61. stock ShowPlayerCustomMenu(playerid, menuid)
  62. {
  63. if (MenuHandle[playerid]) HidePlayerCustomMenu(playerid);
  64. TextDrawShowForPlayer(playerid, CustomMenuEnum[menuid][menuTD]);
  65. for (new i = 1; i <= CustomMenuItemCount[menuid]; i += 1)
  66. {
  67. if (i == 1)
  68. {
  69. TextDrawColor(CustomMenuItemTextdraw[menuid][i], 286392319);
  70. }
  71. else
  72. {
  73. TextDrawColor(CustomMenuItemTextdraw[menuid][i], -1);
  74. }
  75. TextDrawShowForPlayer(playerid, CustomMenuItemTextdraw[menuid][i]);
  76. }
  77. MenuItemHandle[playerid] = 1;
  78. MenuHandle[playerid] = menuid;
  79. TogglePlayerControllable(playerid, 0);
  80. return 1;
  81. }
  82. stock DestroyCustomMenu(menuid)
  83. {
  84. for (new i = 0; i < MAX_PLAYERS; i += 1)
  85. {
  86. if (MenuHandle[i] == menuid)
  87. {
  88. HidePlayerCustomMenu(i);
  89. }
  90. }
  91. TextDrawDestroy(CustomMenuEnum[menuid][menuTD]);
  92. for (new i = 1; i <= CustomMenuItemCount[menuid]; i += 1)
  93. {
  94. TextDrawDestroy(CustomMenuItemTextdraw[menuid][i]);
  95. }
  96. CustomMenuItemCount[menuid] = 0;
  97. CustomMenuCount -= 1;
  98. return 1;
  99. }
  100. stock menu_OnPlayerUpdate(playerid)
  101. {
  102. new
  103. keys,
  104. updown,
  105. leftright;
  106. GetPlayerKeys(playerid, keys, updown, leftright);
  107. if (updown > 0)
  108. {
  109. if (MenuItemHandle[playerid] == CustomMenuItemCount[MenuHandle[playerid]]) return 1;
  110. if (keys & KEY_SECONDARY_ATTACK) return 1;
  111. MenuItemHandle[playerid] += 1;
  112. TextDrawHideForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]-1]);
  113. TextDrawHideForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]]);
  114. TextDrawColor(CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]-1], -1);
  115. TextDrawColor(CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]], 286392319);
  116. TextDrawShowForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]-1]);
  117. TextDrawShowForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]]);
  118. }
  119. else if(updown < 0)
  120. {
  121. if (MenuItemHandle[playerid] == 1) return 1;
  122. if (keys & KEY_SECONDARY_ATTACK) return 1;
  123. MenuItemHandle[playerid] -= 1;
  124. TextDrawHideForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]+1]);
  125. TextDrawHideForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]]);
  126. TextDrawColor(CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]+1], -1);
  127. TextDrawColor(CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]], 286392319);
  128. TextDrawShowForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]+1]);
  129. TextDrawShowForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][MenuItemHandle[playerid]]);
  130. }
  131. return 1;
  132. }
  133. stock HidePlayerCustomMenu(playerid)
  134. {
  135. TextDrawHideForPlayer(playerid, CustomMenuEnum[MenuHandle[playerid]][menuTD]);
  136. for (new i = 1; i <= CustomMenuItemCount[MenuHandle[playerid]]; i += 1)
  137. {
  138. TextDrawHideForPlayer(playerid, CustomMenuItemTextdraw[MenuHandle[playerid]][i]);
  139. }
  140. MenuItemHandle[playerid] = 0;
  141. MenuHandle[playerid] = 0;
  142. TogglePlayerControllable(playerid, 1);
  143. return 1;
  144. }
  145. stock menu_OnPlayerDisconnect(playerid)
  146. {
  147. HidePlayerCustomMenu(playerid);
  148. return 1;
  149. }
  150. stock menu_OnFilterScriptExit()
  151. {
  152. for (new i = 1; i <= CustomMenuCount; i += 1)
  153. {
  154. DestroyCustomMenu(i);
  155. }
  156. return 1;
  157. }
  158. stock menu_OnGameModeExit()
  159. {
  160. return menu_OnFilterScriptExit();
  161. }
  162. stock menu_OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  163. {
  164. #pragma unused oldkeys
  165. if ((newkeys & KEY_SECONDARY_ATTACK) && (MenuHandle[playerid]))
  166. {
  167. if (funcidx("OnPlayerSelectMenuItem") != -1)
  168. {
  169. CallRemoteFunction("OnPlayerSelectMenuItem", "ddd", playerid, MenuHandle[playerid], MenuItemHandle[playerid]);
  170. }
  171. return 1;
  172. }
  173. return 1;
  174. }
  175. stock GetPlayerMenuID(playerid)
  176. {
  177. return MenuHandle[playerid];
  178. }
  179. stock GetPlayerItemID(playerid)
  180. {
  181. return MenuItemHandle[playerid];
  182. }