Advertisement
Guest User

Untitled

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