SAMP Gitlab CI Test
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
14 KiB

  1. //
  2. // Admin player skin changer using previews. For SA-MP 0.3x and above.
  3. // - Kye 2012
  4. //
  5. #include <a_samp>
  6. #include "../include/gl_common.inc"
  7. #define TOTAL_ITEMS 312
  8. #define SELECTION_ITEMS 21
  9. #define ITEMS_PER_LINE 7
  10. #define HEADER_TEXT "Skins"
  11. #define NEXT_TEXT "Next"
  12. #define PREV_TEXT "Prev"
  13. #define DIALOG_BASE_X 75.0
  14. #define DIALOG_BASE_Y 130.0
  15. #define DIALOG_WIDTH 550.0
  16. #define DIALOG_HEIGHT 180.0
  17. #define SPRITE_DIM_X 60.0
  18. #define SPRITE_DIM_Y 70.0
  19. new gTotalItems = TOTAL_ITEMS;
  20. new PlayerText:gCurrentPageTextDrawId[MAX_PLAYERS];
  21. new PlayerText:gHeaderTextDrawId[MAX_PLAYERS];
  22. new PlayerText:gBackgroundTextDrawId[MAX_PLAYERS];
  23. new PlayerText:gNextButtonTextDrawId[MAX_PLAYERS];
  24. new PlayerText:gPrevButtonTextDrawId[MAX_PLAYERS];
  25. new PlayerText:gSelectionItems[MAX_PLAYERS][SELECTION_ITEMS];
  26. new gSelectionItemsTag[MAX_PLAYERS][SELECTION_ITEMS];
  27. new gItemAt[MAX_PLAYERS];
  28. new gItemList[TOTAL_ITEMS] = {
  29. 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
  30. 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,
  31. 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,
  32. 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,
  33. 167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,
  34. 202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,
  35. 237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,
  36. 272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,
  37. 300,301,302,303,304,305,306,307,308,309,310,311
  38. };
  39. //------------------------------------------------
  40. public OnFilterScriptInit()
  41. {
  42. print("\n--Admin Player Skin Changer Loaded\n");
  43. return 1;
  44. }
  45. //------------------------------------------------
  46. GetNumberOfPages()
  47. {
  48. if((gTotalItems >= SELECTION_ITEMS) && (gTotalItems % SELECTION_ITEMS) == 0)
  49. {
  50. return (gTotalItems / SELECTION_ITEMS);
  51. }
  52. else return (gTotalItems / SELECTION_ITEMS) + 1;
  53. }
  54. //------------------------------------------------
  55. PlayerText:CreateCurrentPageTextDraw(playerid, Float:Xpos, Float:Ypos)
  56. {
  57. new PlayerText:txtInit;
  58. txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, "0/0");
  59. PlayerTextDrawUseBox(playerid, txtInit, 0);
  60. PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1);
  61. PlayerTextDrawFont(playerid, txtInit, 1);
  62. PlayerTextDrawSetShadow(playerid, txtInit, 0);
  63. PlayerTextDrawSetOutline(playerid, txtInit, 1);
  64. PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF);
  65. PlayerTextDrawShow(playerid, txtInit);
  66. return txtInit;
  67. }
  68. //------------------------------------------------
  69. // Creates a button textdraw and returns the textdraw ID.
  70. PlayerText:CreatePlayerDialogButton(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height, button_text[])
  71. {
  72. new PlayerText:txtInit;
  73. txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, button_text);
  74. PlayerTextDrawUseBox(playerid, txtInit, 1);
  75. PlayerTextDrawBoxColor(playerid, txtInit, 0x000000FF);
  76. PlayerTextDrawBackgroundColor(playerid, txtInit, 0x000000FF);
  77. PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1);
  78. PlayerTextDrawFont(playerid, txtInit, 1);
  79. PlayerTextDrawSetShadow(playerid, txtInit, 0); // no shadow
  80. PlayerTextDrawSetOutline(playerid, txtInit, 0);
  81. PlayerTextDrawColor(playerid, txtInit, 0x4A5A6BFF);
  82. PlayerTextDrawSetSelectable(playerid, txtInit, 1);
  83. PlayerTextDrawAlignment(playerid, txtInit, 2);
  84. PlayerTextDrawTextSize(playerid, txtInit, Height, Width); // The width and height are reversed for centering.. something the game does <g>
  85. PlayerTextDrawShow(playerid, txtInit);
  86. return txtInit;
  87. }
  88. //------------------------------------------------
  89. PlayerText:CreatePlayerHeaderTextDraw(playerid, Float:Xpos, Float:Ypos, header_text[])
  90. {
  91. new PlayerText:txtInit;
  92. txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, header_text);
  93. PlayerTextDrawUseBox(playerid, txtInit, 0);
  94. PlayerTextDrawLetterSize(playerid, txtInit, 1.25, 3.0);
  95. PlayerTextDrawFont(playerid, txtInit, 0);
  96. PlayerTextDrawSetShadow(playerid, txtInit, 0);
  97. PlayerTextDrawSetOutline(playerid, txtInit, 1);
  98. PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF);
  99. PlayerTextDrawShow(playerid, txtInit);
  100. return txtInit;
  101. }
  102. //------------------------------------------------
  103. PlayerText:CreatePlayerBackgroundTextDraw(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height)
  104. {
  105. new PlayerText:txtBackground = CreatePlayerTextDraw(playerid, Xpos, Ypos,
  106. " ~n~"); // enough space for everyone
  107. PlayerTextDrawUseBox(playerid, txtBackground, 1);
  108. PlayerTextDrawBoxColor(playerid, txtBackground, 0x4A5A6BBB);
  109. PlayerTextDrawLetterSize(playerid, txtBackground, 5.0, 5.0);
  110. PlayerTextDrawFont(playerid, txtBackground, 0);
  111. PlayerTextDrawSetShadow(playerid, txtBackground, 0);
  112. PlayerTextDrawSetOutline(playerid, txtBackground, 0);
  113. PlayerTextDrawColor(playerid, txtBackground,0x000000FF);
  114. PlayerTextDrawTextSize(playerid, txtBackground, Width, Height);
  115. PlayerTextDrawBackgroundColor(playerid, txtBackground, 0x4A5A6BBB);
  116. PlayerTextDrawShow(playerid, txtBackground);
  117. return txtBackground;
  118. }
  119. //------------------------------------------------
  120. // Creates a model preview sprite
  121. PlayerText:CreateModelPreviewTextDraw(playerid, modelindex, Float:Xpos, Float:Ypos, Float:width, Float:height)
  122. {
  123. new PlayerText:txtPlayerSprite = CreatePlayerTextDraw(playerid, Xpos, Ypos, ""); // it has to be set with SetText later
  124. PlayerTextDrawFont(playerid, txtPlayerSprite, TEXT_DRAW_FONT_MODEL_PREVIEW);
  125. PlayerTextDrawColor(playerid, txtPlayerSprite, 0xFFFFFFFF);
  126. PlayerTextDrawBackgroundColor(playerid, txtPlayerSprite, 0x88888899);
  127. PlayerTextDrawTextSize(playerid, txtPlayerSprite, width, height); // Text size is the Width:Height
  128. PlayerTextDrawSetPreviewModel(playerid, txtPlayerSprite, modelindex);
  129. PlayerTextDrawSetSelectable(playerid, txtPlayerSprite, 1);
  130. PlayerTextDrawShow(playerid,txtPlayerSprite);
  131. return txtPlayerSprite;
  132. }
  133. //------------------------------------------------
  134. DestroyPlayerModelPreviews(playerid)
  135. {
  136. new x=0;
  137. while(x != SELECTION_ITEMS) {
  138. if(gSelectionItems[playerid][x] != PlayerText:INVALID_TEXT_DRAW) {
  139. PlayerTextDrawDestroy(playerid, gSelectionItems[playerid][x]);
  140. gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW;
  141. }
  142. x++;
  143. }
  144. }
  145. //------------------------------------------------
  146. ShowPlayerModelPreviews(playerid)
  147. {
  148. new x=0;
  149. new Float:BaseX = DIALOG_BASE_X;
  150. new Float:BaseY = DIALOG_BASE_Y - (SPRITE_DIM_Y * 0.33); // down a bit
  151. new linetracker = 0;
  152. new itemat = GetPVarInt(playerid, "skinc_page") * SELECTION_ITEMS;
  153. // Destroy any previous ones created
  154. DestroyPlayerModelPreviews(playerid);
  155. while(x != SELECTION_ITEMS && itemat < gTotalItems) {
  156. if(linetracker == 0) {
  157. BaseX = DIALOG_BASE_X + 25.0; // in a bit from the box
  158. BaseY += SPRITE_DIM_Y + 1.0; // move on the Y for the next line
  159. }
  160. gSelectionItems[playerid][x] = CreateModelPreviewTextDraw(playerid, gItemList[itemat], BaseX, BaseY, SPRITE_DIM_X, SPRITE_DIM_Y);
  161. gSelectionItemsTag[playerid][x] = gItemList[itemat];
  162. BaseX += SPRITE_DIM_X + 1.0; // move on the X for the next sprite
  163. linetracker++;
  164. if(linetracker == ITEMS_PER_LINE) linetracker = 0;
  165. itemat++;
  166. x++;
  167. }
  168. }
  169. //------------------------------------------------
  170. UpdatePageTextDraw(playerid)
  171. {
  172. new PageText[64+1];
  173. format(PageText, 64, "%d/%d", GetPVarInt(playerid,"skinc_page") + 1, GetNumberOfPages());
  174. PlayerTextDrawSetString(playerid, gCurrentPageTextDrawId[playerid], PageText);
  175. }
  176. //------------------------------------------------
  177. CreateSelectionMenu(playerid)
  178. {
  179. gBackgroundTextDrawId[playerid] = CreatePlayerBackgroundTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y + 20.0, DIALOG_WIDTH, DIALOG_HEIGHT);
  180. gHeaderTextDrawId[playerid] = CreatePlayerHeaderTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y, HEADER_TEXT);
  181. gCurrentPageTextDrawId[playerid] = CreateCurrentPageTextDraw(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y + 15.0);
  182. gNextButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, NEXT_TEXT);
  183. gPrevButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 90.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, PREV_TEXT);
  184. ShowPlayerModelPreviews(playerid);
  185. UpdatePageTextDraw(playerid);
  186. }
  187. //------------------------------------------------
  188. DestroySelectionMenu(playerid)
  189. {
  190. DestroyPlayerModelPreviews(playerid);
  191. PlayerTextDrawDestroy(playerid, gHeaderTextDrawId[playerid]);
  192. PlayerTextDrawDestroy(playerid, gBackgroundTextDrawId[playerid]);
  193. PlayerTextDrawDestroy(playerid, gCurrentPageTextDrawId[playerid]);
  194. PlayerTextDrawDestroy(playerid, gNextButtonTextDrawId[playerid]);
  195. PlayerTextDrawDestroy(playerid, gPrevButtonTextDrawId[playerid]);
  196. gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  197. gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  198. gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  199. gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  200. gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  201. }
  202. //------------------------------------------------
  203. HandlePlayerItemSelection(playerid, selecteditem)
  204. {
  205. // In this case we change the player's skin
  206. if(gSelectionItemsTag[playerid][selecteditem] >= 0 && gSelectionItemsTag[playerid][selecteditem] < 319) {
  207. SetPlayerSkin(playerid, gSelectionItemsTag[playerid][selecteditem]);
  208. return;
  209. }
  210. }
  211. //------------------------------------------------
  212. public OnPlayerConnect(playerid)
  213. {
  214. // Init all of the textdraw related globals
  215. gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  216. gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  217. gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  218. gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  219. gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
  220. for(new x=0; x < SELECTION_ITEMS; x++) {
  221. gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW;
  222. }
  223. gItemAt[playerid] = 0;
  224. return 1; // Allow other scripts to keep processing OnPlayerConnect
  225. }
  226. //-------------------------------------------
  227. // Even though only Player* textdraws are used in this script,
  228. // OnPlayerClickTextDraw is still required to handle ESC
  229. public OnPlayerClickTextDraw(playerid, Text:clickedid)
  230. {
  231. if(GetPVarInt(playerid, "skinc_active") == 0) return 0;
  232. // Handle: They cancelled (with ESC)
  233. if(clickedid == Text:INVALID_TEXT_DRAW) {
  234. DestroySelectionMenu(playerid);
  235. SetPVarInt(playerid, "skinc_active", 0);
  236. PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
  237. return 1;
  238. }
  239. return 0;
  240. }
  241. //------------------------------------------------
  242. public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
  243. {
  244. if(GetPVarInt(playerid, "skinc_active") == 0) return 0;
  245. new curpage = GetPVarInt(playerid, "skinc_page");
  246. // Handle: next button
  247. if(playertextid == gNextButtonTextDrawId[playerid]) {
  248. if(curpage < (GetNumberOfPages() - 1)) {
  249. SetPVarInt(playerid, "skinc_page", curpage + 1);
  250. ShowPlayerModelPreviews(playerid);
  251. UpdatePageTextDraw(playerid);
  252. PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
  253. } else {
  254. PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
  255. }
  256. return 1;
  257. }
  258. // Handle: previous button
  259. if(playertextid == gPrevButtonTextDrawId[playerid]) {
  260. if(curpage > 0) {
  261. SetPVarInt(playerid, "skinc_page", curpage - 1);
  262. ShowPlayerModelPreviews(playerid);
  263. UpdatePageTextDraw(playerid);
  264. PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0);
  265. } else {
  266. PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
  267. }
  268. return 1;
  269. }
  270. // Search in the array of textdraws used for the items
  271. new x=0;
  272. while(x != SELECTION_ITEMS) {
  273. if(playertextid == gSelectionItems[playerid][x]) {
  274. HandlePlayerItemSelection(playerid, x);
  275. PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
  276. DestroySelectionMenu(playerid);
  277. CancelSelectTextDraw(playerid);
  278. SetPVarInt(playerid, "skinc_active", 0);
  279. return 1;
  280. }
  281. x++;
  282. }
  283. return 0;
  284. }
  285. //------------------------------------------------
  286. public OnPlayerCommandText(playerid, cmdtext[])
  287. {
  288. new cmd[256+1];
  289. new idx;
  290. if(!IsPlayerAdmin(playerid)) return 0;
  291. cmd = strtok(cmdtext, idx);
  292. if(strcmp("/skinchange", cmd, true) == 0)
  293. {
  294. // If there was a previously created selection menu, destroy it
  295. DestroySelectionMenu(playerid);
  296. SetPVarInt(playerid, "skinc_active", 1);
  297. //SetPVarInt(playerid, "skinc_page", 0); // will reset the page back to the first
  298. CreateSelectionMenu(playerid);
  299. SelectTextDraw(playerid, 0xACCBF1FF);
  300. return 1;
  301. }
  302. return 0;
  303. }
  304. //------------------------------------------------