1
0

selection.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. // Emmet's selection menu include for Limitless Roleplay.
  2. // Essentially the "eSelection 2.0" - created on 12/29/2016 @ 7:14 AM.
  3. #if !defined MAX_SELECTION_MENU_ITEMS
  4. #define MAX_SELECTION_MENU_ITEMS (312)
  5. #endif
  6. enum e_SELECTION_MENU
  7. {
  8. PlayerText: pMenuTitle,
  9. PlayerText: pMenuPage,
  10. PlayerText: pMenuBoxes[24],
  11. bool: pDisplayed,
  12. pExtra,
  13. pPage,
  14. pPages,
  15. pItems,
  16. pTime,
  17. pIgnore,
  18. pList[MAX_SELECTION_MENU_ITEMS]
  19. };
  20. static
  21. Text: selectorBaseTD[5],
  22. selectorMenu[MAX_PLAYERS][e_SELECTION_MENU];
  23. // This is the callback which selection menu responses will be called to.
  24. forward OnPlayerSelectionMenuResponse(playerid, extraid, response, listitem, modelid);
  25. selector_InitMain()
  26. {
  27. // Why fill up player textdraw slots when you can just use plain old textdraws for these ones?
  28. selectorBaseTD[0] = TextDrawCreate(519.000000, 119.000000, "_");
  29. TextDrawBackgroundColor(selectorBaseTD[0], 255);
  30. TextDrawFont(selectorBaseTD[0], 1);
  31. TextDrawLetterSize(selectorBaseTD[0], 0.500000, 1.100000);
  32. TextDrawColor(selectorBaseTD[0], -1);
  33. TextDrawSetOutline(selectorBaseTD[0], 0);
  34. TextDrawSetProportional(selectorBaseTD[0], 1);
  35. TextDrawSetShadow(selectorBaseTD[0], 1);
  36. TextDrawUseBox(selectorBaseTD[0], 1);
  37. TextDrawBoxColor(selectorBaseTD[0], 153);
  38. TextDrawTextSize(selectorBaseTD[0], 156.000000, 0.000000);
  39. selectorBaseTD[1] = TextDrawCreate(519.000000, 119.000000, "_");
  40. TextDrawBackgroundColor(selectorBaseTD[1], 255);
  41. TextDrawFont(selectorBaseTD[1], 1);
  42. TextDrawLetterSize(selectorBaseTD[1], 0.500000, 32.050010);
  43. TextDrawColor(selectorBaseTD[1], -1);
  44. TextDrawSetOutline(selectorBaseTD[1], 0);
  45. TextDrawSetProportional(selectorBaseTD[1], 1);
  46. TextDrawSetShadow(selectorBaseTD[1], 1);
  47. TextDrawUseBox(selectorBaseTD[1], 1);
  48. TextDrawBoxColor(selectorBaseTD[1], 119);
  49. TextDrawTextSize(selectorBaseTD[1], 156.000000, 0.000000);
  50. selectorBaseTD[2] = TextDrawCreate(457.500000, 393.000000, "Back");
  51. TextDrawAlignment(selectorBaseTD[2], 2);
  52. TextDrawBackgroundColor(selectorBaseTD[2], 255);
  53. TextDrawFont(selectorBaseTD[2], 2);
  54. TextDrawLetterSize(selectorBaseTD[2], 0.180000, 1.300000);
  55. TextDrawColor(selectorBaseTD[2], -1);
  56. TextDrawSetOutline(selectorBaseTD[2], 1);
  57. TextDrawSetProportional(selectorBaseTD[2], 1);
  58. TextDrawUseBox(selectorBaseTD[2], 1);
  59. TextDrawBoxColor(selectorBaseTD[2], 136);
  60. TextDrawTextSize(selectorBaseTD[2], 10.000000, 32.000000);
  61. TextDrawSetSelectable(selectorBaseTD[2], 1);
  62. selectorBaseTD[3] = TextDrawCreate(494.000000, 393.000000, "Next");
  63. TextDrawAlignment(selectorBaseTD[3], 2);
  64. TextDrawBackgroundColor(selectorBaseTD[3], 255);
  65. TextDrawFont(selectorBaseTD[3], 2);
  66. TextDrawLetterSize(selectorBaseTD[3], 0.180000, 1.300000);
  67. TextDrawColor(selectorBaseTD[3], -1);
  68. TextDrawSetOutline(selectorBaseTD[3], 1);
  69. TextDrawSetProportional(selectorBaseTD[3], 1);
  70. TextDrawUseBox(selectorBaseTD[3], 1);
  71. TextDrawBoxColor(selectorBaseTD[3], 136);
  72. TextDrawTextSize(selectorBaseTD[3], 10.000000, 32.000000);
  73. TextDrawSetSelectable(selectorBaseTD[3], 1);
  74. selectorBaseTD[4] = TextDrawCreate(511.000000, 119.000000, "~r~X");
  75. TextDrawAlignment(selectorBaseTD[4], 2);
  76. TextDrawBackgroundColor(selectorBaseTD[4], 255);
  77. TextDrawFont(selectorBaseTD[4], 2);
  78. TextDrawLetterSize(selectorBaseTD[4], 0.220000, 1.100000);
  79. TextDrawColor(selectorBaseTD[4], -1);
  80. TextDrawSetOutline(selectorBaseTD[4], 1);
  81. TextDrawSetProportional(selectorBaseTD[4], 1);
  82. TextDrawUseBox(selectorBaseTD[4], 1);
  83. TextDrawBoxColor(selectorBaseTD[4], 255);
  84. TextDrawTextSize(selectorBaseTD[4], 10.000000, 10.000000);
  85. TextDrawSetSelectable(selectorBaseTD[4], 1);
  86. }
  87. stock ShowPlayerSelectionMenu(playerid, extraid, name[], const items[] = {-1}, size = sizeof(items))
  88. {
  89. // 164.000000, 134.000000
  90. // 222.000000, 198.000000
  91. if(!IsPlayerConnected(playerid))
  92. return false;
  93. if(size > MAX_SELECTION_MENU_ITEMS)
  94. return false;
  95. if(selectorMenu[playerid][pDisplayed])
  96. {
  97. HidePlayerSelectionMenu(playerid);
  98. }
  99. new
  100. Float:x = 106.00,
  101. Float:y = 134.00,
  102. index = 0;
  103. // This textdraw shows the name of the menu in the header.
  104. selectorMenu[playerid][pMenuTitle] = CreatePlayerTextDraw(playerid, 160.000000, 117.000000, name);
  105. PlayerTextDrawBackgroundColor(playerid, selectorMenu[playerid][pMenuTitle], 255);
  106. PlayerTextDrawFont(playerid, selectorMenu[playerid][pMenuTitle], 2);
  107. PlayerTextDrawLetterSize(playerid, selectorMenu[playerid][pMenuTitle], 0.230000, 1.399999);
  108. PlayerTextDrawColor(playerid, selectorMenu[playerid][pMenuTitle], -1);
  109. PlayerTextDrawSetOutline(playerid, selectorMenu[playerid][pMenuTitle], 1);
  110. PlayerTextDrawSetProportional(playerid, selectorMenu[playerid][pMenuTitle], 1);
  111. // This textdraw shows the current page the menu is on.
  112. selectorMenu[playerid][pMenuPage] = CreatePlayerTextDraw(playerid, 340.000000, 116.000000, "1/5");
  113. PlayerTextDrawAlignment(playerid, selectorMenu[playerid][pMenuPage], 2);
  114. PlayerTextDrawBackgroundColor(playerid, selectorMenu[playerid][pMenuPage], 255);
  115. PlayerTextDrawFont(playerid, selectorMenu[playerid][pMenuPage], 2);
  116. PlayerTextDrawLetterSize(playerid, selectorMenu[playerid][pMenuPage], 0.220000, 1.500000);
  117. PlayerTextDrawColor(playerid, selectorMenu[playerid][pMenuPage], -1);
  118. PlayerTextDrawSetOutline(playerid, selectorMenu[playerid][pMenuPage], 1);
  119. PlayerTextDrawSetProportional(playerid, selectorMenu[playerid][pMenuPage], 1);
  120. for(new i = 0; i < size; i ++)
  121. {
  122. if(items[i] == -1)
  123. {
  124. // Here's some code to fix a bug where indeterminate array sizes would still add invalid models to the menu.
  125. size = i + 1;
  126. break;
  127. }
  128. }
  129. for(new i = 0; i < 24; i ++)
  130. {
  131. if(i < size && items[i] >= 0)
  132. {
  133. if((i > 0) && (i % 6) == 0)
  134. {
  135. // Start at the first column.
  136. x = 106.0;
  137. // Start on the next row.
  138. y += 64.0;
  139. }
  140. selectorMenu[playerid][pMenuBoxes][index] = CreatePlayerTextDraw(playerid, x += 58.0, y, "_");
  141. PlayerTextDrawBackgroundColor(playerid, selectorMenu[playerid][pMenuBoxes][index], 136);
  142. PlayerTextDrawFont(playerid, selectorMenu[playerid][pMenuBoxes][index], 5);
  143. PlayerTextDrawLetterSize(playerid, selectorMenu[playerid][pMenuBoxes][index], 0.470000, 2.000000);
  144. PlayerTextDrawSetProportional(playerid, selectorMenu[playerid][pMenuBoxes][index], 1);
  145. PlayerTextDrawSetShadow(playerid, selectorMenu[playerid][pMenuBoxes][index], 1);
  146. PlayerTextDrawUseBox(playerid, selectorMenu[playerid][pMenuBoxes][index], 1);
  147. PlayerTextDrawBoxColor(playerid, selectorMenu[playerid][pMenuBoxes][index], 0);
  148. PlayerTextDrawTextSize(playerid, selectorMenu[playerid][pMenuBoxes][index], 57.000000, 63.000000);
  149. PlayerTextDrawSetPreviewModel(playerid, selectorMenu[playerid][pMenuBoxes][index], items[i]);
  150. PlayerTextDrawSetPreviewRot(playerid, selectorMenu[playerid][pMenuBoxes][index], -16.0000, 0.0000, -55.0000, 1.0000);
  151. PlayerTextDrawSetSelectable(playerid, selectorMenu[playerid][pMenuBoxes][index], 1);
  152. PlayerTextDrawShow(playerid, selectorMenu[playerid][pMenuBoxes][index++]);
  153. }
  154. else
  155. {
  156. selectorMenu[playerid][pMenuBoxes][index] = PlayerText:INVALID_3DTEXT_ID;
  157. }
  158. }
  159. for(new i = 0; i < MAX_SELECTION_MENU_ITEMS; i ++)
  160. {
  161. if(i < 5)
  162. TextDrawShowForPlayer(playerid, selectorBaseTD[i]);
  163. if(i < size)
  164. selectorMenu[playerid][pList][i] = items[i];
  165. else
  166. selectorMenu[playerid][pList][i] = -1;
  167. }
  168. selectorMenu[playerid][pDisplayed] = true;
  169. selectorMenu[playerid][pIgnore] = false;
  170. selectorMenu[playerid][pExtra] = extraid;
  171. selectorMenu[playerid][pPage] = 1;
  172. selectorMenu[playerid][pPages] = (size % 24 == 0) ? size / 24 : (size / 24) + 1;
  173. selectorMenu[playerid][pItems] = size;
  174. selectorMenu[playerid][pTime] = NetStats_GetConnectedTime(playerid);
  175. PlayerTextDrawShow(playerid, selectorMenu[playerid][pMenuTitle]);
  176. //PlayerTextDrawShow(playerid, selectorMenu[playerid][pMenuPage]);
  177. SelectTextDraw(playerid, -1);
  178. return true;
  179. }
  180. stock HidePlayerSelectionMenu(playerid)
  181. {
  182. if(!IsPlayerConnected(playerid) || !selectorMenu[playerid][pDisplayed])
  183. return false;
  184. for(new i = 0; i < MAX_SELECTION_MENU_ITEMS; i ++)
  185. {
  186. if(i < 24)
  187. PlayerTextDrawDestroy(playerid, selectorMenu[playerid][pMenuBoxes][i]);
  188. if(i < 5)
  189. TextDrawHideForPlayer(playerid, selectorBaseTD[i]);
  190. selectorMenu[playerid][pList][i] = -1;
  191. }
  192. selectorMenu[playerid][pDisplayed] = false;
  193. selectorMenu[playerid][pIgnore] = true;
  194. selectorMenu[playerid][pExtra] = -1;
  195. selectorMenu[playerid][pPage] = 0;
  196. PlayerTextDrawDestroy(playerid, selectorMenu[playerid][pMenuTitle]);
  197. PlayerTextDrawDestroy(playerid, selectorMenu[playerid][pMenuPage]);
  198. CancelSelectTextDraw(playerid);
  199. return true;
  200. }
  201. static SetPlayerSelectionMenuPage(playerid, page)
  202. {
  203. if(!IsPlayerConnected(playerid) || !selectorMenu[playerid][pDisplayed])
  204. return false;
  205. if(!(1 <= page <= selectorMenu[playerid][pPages]))
  206. return false;
  207. new start = (page - 1) * 24;
  208. for(new i = 0; i < 24; i ++)
  209. {
  210. PlayerTextDrawHide(playerid, selectorMenu[playerid][pMenuBoxes][i]);
  211. if(start < selectorMenu[playerid][pItems])
  212. {
  213. PlayerTextDrawSetPreviewModel(playerid, selectorMenu[playerid][pMenuBoxes][i], selectorMenu[playerid][pList][start++]);
  214. PlayerTextDrawShow(playerid, selectorMenu[playerid][pMenuBoxes][i]);
  215. }
  216. }
  217. selectorMenu[playerid][pPage] = page;
  218. return true;
  219. }
  220. forward EnableSelectionMenuCursor(playerid);
  221. public EnableSelectionMenuCursor(playerid)
  222. {
  223. if(selectorMenu[playerid][pDisplayed])
  224. {
  225. SelectTextDraw(playerid, -1);
  226. }
  227. }
  228. public OnFilterScriptInit()
  229. {
  230. selector_InitMain();
  231. #if defined SM_OnFilterScriptInit
  232. return SM_OnFilterScriptInit();
  233. #else
  234. return 1;
  235. #endif
  236. }
  237. #if defined _ALS_OnFilterScriptInit
  238. #undef OnFilterScriptInit
  239. #else
  240. #define _ALS_OnFilterScriptInit
  241. #endif
  242. #define OnFilterScriptInit SM_OnFilterScriptInit
  243. #if defined SM_OnFilterScriptInit
  244. forward SM_OnFilterScriptInit();
  245. #endif
  246. public OnGameModeInit()
  247. {
  248. selector_InitMain();
  249. #if defined SM_OnGameModeInit
  250. return SM_OnGameModeInit();
  251. #else
  252. return 1;
  253. #endif
  254. }
  255. #if defined _ALS_OnGameModeInit
  256. #undef OnGameModeInit
  257. #else
  258. #define _ALS_OnGameModeInit
  259. #endif
  260. #define OnGameModeInit SM_OnGameModeInit
  261. #if defined SM_OnGameModeInit
  262. forward SM_OnGameModeInit();
  263. #endif
  264. public OnFilterScriptExit()
  265. {
  266. // Destroy the base textdraws - they don't destroy on their own!
  267. for(new i = 0; i < 5; i ++)
  268. {
  269. TextDrawDestroy(selectorBaseTD[i]);
  270. }
  271. // Unlike gamemodes, filterscripts don't destroy per-player textdraws upon exit.
  272. for(new i = 0; i <= GetPlayerPoolSize(); i ++)
  273. {
  274. if(IsPlayerConnected(i) && selectorMenu[i][pDisplayed])
  275. {
  276. HidePlayerSelectionMenu(i);
  277. }
  278. }
  279. #if defined SM_OnFilterScriptExit
  280. return SM_OnFilterScriptExit();
  281. #else
  282. return 1;
  283. #endif
  284. }
  285. #if defined _ALS_OnFilterScriptExit
  286. #undef OnFilterScriptExit
  287. #else
  288. #define _ALS_OnFilterScriptExit
  289. #endif
  290. #define OnFilterScriptExit SM_OnFilterScriptExit
  291. #if defined SM_OnFilterScriptExit
  292. forward SM_OnFilterScriptExit();
  293. #endif
  294. public OnPlayerDisconnect(playerid, reason)
  295. {
  296. if(selectorMenu[playerid][pDisplayed])
  297. {
  298. HidePlayerSelectionMenu(playerid);
  299. }
  300. #if defined SM_OnPlayerDisconnect
  301. return SM_OnPlayerDisconnect(playerid, reason);
  302. #else
  303. return 1;
  304. #endif
  305. }
  306. #if defined _ALS_OnPlayerDisconnect
  307. #undef OnPlayerDisconnect
  308. #else
  309. #define _ALS_OnPlayerDisconnect
  310. #endif
  311. #define OnPlayerDisconnect SM_OnPlayerDisconnect
  312. #if defined SM_OnPlayerDisconnect
  313. forward SM_OnPlayerDisconnect(playerid, reason);
  314. #endif
  315. public OnPlayerClickTextDraw(playerid, Text:clickedid)
  316. {
  317. if(selectorMenu[playerid][pIgnore])
  318. {
  319. selectorMenu[playerid][pIgnore] = 0;
  320. }
  321. else if(selectorMenu[playerid][pDisplayed])
  322. {
  323. if(clickedid == Text:INVALID_TEXT_DRAW || clickedid == selectorBaseTD[4])
  324. {
  325. if(funcidx("OnPlayerSelectionMenuResponse") == -1 || CallLocalFunction("OnPlayerSelectionMenuResponse", "iiiii", playerid, selectorMenu[playerid][pExtra], 0, -1, -1))
  326. {
  327. HidePlayerSelectionMenu(playerid);
  328. }
  329. else
  330. {
  331. SetTimerEx("EnableSelectionMenuCursor", 200, false, "i", playerid);
  332. }
  333. }
  334. else if(clickedid == selectorBaseTD[2] && selectorMenu[playerid][pPage] > 1)
  335. {
  336. SetPlayerSelectionMenuPage(playerid, selectorMenu[playerid][pPage] - 1);
  337. }
  338. else if(clickedid == selectorBaseTD[3] && selectorMenu[playerid][pPage] < selectorMenu[playerid][pPages])
  339. {
  340. SetPlayerSelectionMenuPage(playerid, selectorMenu[playerid][pPage] + 1);
  341. }
  342. return 1;
  343. }
  344. #if defined SM_OnPlayerClickTextDraw
  345. return SM_OnPlayerClickTextDraw(playerid, clickedid);
  346. #else
  347. return 1;
  348. #endif
  349. }
  350. #if defined _ALS_OnPlayerClickTextDraw
  351. #undef OnPlayerClickTextDraw
  352. #else
  353. #define _ALS_OnPlayerClickTextDraw
  354. #endif
  355. #define OnPlayerClickTextDraw SM_OnPlayerClickTextDraw
  356. #if defined SM_OnPlayerClickTextDraw
  357. forward SM_OnPlayerClickTextDraw(playerid, Text:clickedid);
  358. #endif
  359. public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
  360. {
  361. if(selectorMenu[playerid][pDisplayed] && NetStats_GetConnectedTime(playerid) - selectorMenu[playerid][pTime] > 400)
  362. {
  363. for(new i = 0; i < 24; i ++)
  364. {
  365. if(playertextid == selectorMenu[playerid][pMenuBoxes][i])
  366. {
  367. new
  368. index = ((selectorMenu[playerid][pPage] - 1) * 24) + i,
  369. extraid = selectorMenu[playerid][pExtra],
  370. modelid = selectorMenu[playerid][pList][index];
  371. HidePlayerSelectionMenu(playerid);
  372. CallLocalFunction("OnPlayerSelectionMenuResponse", "iiiii", playerid, extraid, 1, index, modelid);
  373. return 1;
  374. }
  375. }
  376. }
  377. #if defined SM_OnPlayerClickPlayerTextDraw
  378. return SM_OnPlayerClickPlayerTextDraw(playerid, playertextid);
  379. #else
  380. return 1;
  381. #endif
  382. }
  383. #if defined _ALS_OnPlayerClickPlayerTD
  384. #undef OnPlayerClickPlayerTextDraw
  385. #else
  386. #define _ALS_OnPlayerClickPlayerTD
  387. #endif
  388. #define OnPlayerClickPlayerTextDraw SM_OnPlayerClickPlayerTextDraw
  389. #if defined SM_OnPlayerClickPlayerTextDraw
  390. forward SM_OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid);
  391. #endif