Advertisement
AirKite

FIXED skinchanger.pwn

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