Advertisement
Papadopolis

Untitled

Sep 21st, 2012
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.93 KB | None | 0 0
  1. /**
  2.     * In-Game File Editor (Version: R1) *
  3.    
  4.     Author: Pedro P. L. Papadópolis (A.K.A. Mandrakke)
  5.    
  6.     Credits:
  7.         - JaTochNietDan (FileManager plugin)
  8.  
  9.     My sa-mp forums profile: http://forum.sa-mp.com/member.php?u=87086
  10.     The most updated release can be found at:
  11.     http://forum.sa-mp.com/showthread.php?p=2129186
  12. **/
  13.  
  14. #include <a_samp>
  15. #include <filemanager>
  16. //----------------------------------------------------------------------------------------------------------------------------------------
  17. //#pragma unused strtok
  18. #define SERVER_PLAYERS 20
  19. #define AUTO_SETUP
  20. //----------------------------------------------------------------------------------------------------------------------------------------
  21. #define FILTERSCRIPT 1
  22. //----------------------------------------------------------------------------------------------------------------------------------------
  23. #define DIALOG_GERRESPONSE 560
  24. #define DIALOG_FMDIR 559
  25. #define DIALOG_FMFILE 558
  26. #define DIALOG_FMVAR 557
  27. //----------------------------------------------------------------------------------------------------------------------------------------
  28.  
  29. new
  30.     exp[7][128],
  31.     _dirContainer[SERVER_PLAYERS][500],
  32.     _dirContainerSize,
  33.     _dialogClose[SERVER_PLAYERS],
  34.     _dPage[SERVER_PLAYERS],
  35.     _dIndexes[600],
  36.     sInds[SERVER_PLAYERS][300][128],
  37.     sVals[SERVER_PLAYERS][300][20],
  38.     vals[600],
  39.     globListitem[SERVER_PLAYERS],
  40.     _pDir[SERVER_PLAYERS][150],
  41.     _itemsPerList,
  42.     _lastDir[SERVER_PLAYERS][8][50],
  43.     _output[500],
  44.     varEdit[SERVER_PLAYERS],
  45.     _selected[SERVER_PLAYERS][50],
  46.     _currentDir[SERVER_PLAYERS][50],
  47.     _currentFile[SERVER_PLAYERS][50]
  48. ;
  49.  
  50. public OnFilterScriptInit()
  51. {
  52.     print("     --------------------------------------------    ");
  53.     print("      In-Game File Editor Started (By: Mandrakke)    ");
  54.     print("     --------------------------------------------    ");
  55.    
  56.     _dirContainerSize   = sizeof(_dirContainer[]);
  57.     _itemsPerList       = 15;
  58.    
  59.     return 1;
  60. }
  61. //----------------------------------------------------------------------------------------------------------------------------------------
  62. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  63. {
  64.     new path[150], lastchar[2], newpath[150], clean[50];
  65.    
  66.     strmid(_selected[playerid], inputtext, 0, strlen(inputtext) - 1);
  67.     strmid(lastchar, _pDir[playerid], strlen(_pDir[playerid]) - 1, strlen(_pDir[playerid]));
  68.    
  69.     format(clean, sizeof(clean), "%s", _selected[playerid]);
  70.    
  71.     if(strcmp(lastchar, "/", true) == 1) {
  72.         format(_pDir[playerid], sizeof(_pDir[]), "%s/", _pDir[playerid]);
  73.     }
  74.    
  75.     /*
  76.     format(_output, sizeof(_output), "%d %d %d %d %s", playerid, dialogid, response, listitem, inputtext);
  77.     SendClientMessage(playerid, 0xEE4000FF, _output);
  78.     */
  79.  
  80.     if(dialogid == DIALOG_FMDIR) {
  81.         if(response == 1) {
  82.             if(_dialogClose[playerid] == 1 && listitem == 0) return 0;
  83.             else {
  84.                 if(listitem > 0) {
  85.                     globListitem[playerid] = listitem - 1;
  86.                    
  87.                     if(strcmp(_selected[playerid], "/\\ Above directory", true) == 0) {
  88.                         strmid(newpath, _pDir[playerid], 0, (strlen(_pDir[playerid]) - (strlen(getLastDir(playerid)) + 1)));
  89.                         format(path, sizeof(path), "%s", newpath);
  90.                        
  91.                         rmLastDir(playerid, getLastDir(playerid));
  92.                        
  93.                         strmid(_output, path, strlen(path) - (strlen(getLastDir(playerid)) + 1), strlen(path));
  94.                         format(_selected[playerid], sizeof(_selected[]), "%s", _output);
  95.                     } else {
  96.                         format(path, sizeof(path), "%s%s", _pDir[playerid], _selected[playerid]);
  97.                     }
  98.                    
  99.                     if(file_exists(path)) {
  100.                         format(_currentFile[playerid], sizeof(_currentFile[]), "%s", _selected[playerid]);
  101.                         _showFileVars(playerid, path, 1);
  102.                     } else if(dir_exists(path)) {
  103.                         format(_currentDir[playerid], sizeof(_currentFile[]), "%s", _selected[playerid]);
  104.  
  105.                         if(strcmp(clean, "/\\ Above directory", true) == 1) {
  106.                             addLastDir(playerid, clean);
  107.                         }
  108.                            
  109.                         _listDir(path, 1, playerid, 1);
  110.                     } else {
  111.                         ShowPlayerDialog(playerid, 666, DIALOG_STYLE_MSGBOX, "Message", "{FF0000} File or directory not found.", "Close", "");
  112.                     }
  113.                 } else {
  114.                     if(_dPage[playerid] > 1) _dPage[playerid]--;
  115.                     _listDir(_pDir[playerid], 1, playerid, _dPage[playerid]);
  116.                 }
  117.             }
  118.         } else if(response == 0) {
  119.             if(_dialogClose[playerid] == 2) return 0;
  120.             else {
  121.                 if(listitem == 0) {
  122.                     _dPage[playerid]++;
  123.                     _listDir(_pDir[playerid], 1, playerid, _dPage[playerid]);
  124.                 }
  125.             }
  126.         }
  127.  
  128.         return 1;
  129.     } else if(dialogid == DIALOG_FMFILE) {
  130.         format(path, sizeof(path), "%s%s", _pDir[playerid], _currentFile[playerid]);
  131.    
  132.         if(response == 1) {
  133.             if(_dialogClose[playerid] == 1 && listitem == 0) return _listDir(_pDir[playerid], 1, playerid, _dPage[playerid]);
  134.             else {
  135.                 if(listitem > 0) {
  136.                     new valNum, line[128], k;
  137.  
  138.                     globListitem[playerid] = ((_dPage[playerid] - 1) * _itemsPerList) + (listitem - 1);
  139.  
  140.                     valNum = globListitem[playerid];
  141.                     varEdit[playerid] = 0;
  142.                     for(k = 0; k < 300; k++) {
  143.                         if(strlen(sInds[playerid][varEdit[playerid]]) > 0) {
  144.                             explode(exp, line, "=");
  145.  
  146.                             if(varEdit[playerid] == valNum) break;
  147.                         }
  148.  
  149.                         ++varEdit[playerid];
  150.                     }
  151.  
  152.                     format(vals, sizeof(vals), "File %s", _currentFile[playerid]);
  153.                    
  154.                     if(strlen(sVals[playerid][varEdit[playerid]]) > 0) {
  155.                         format(_dIndexes, sizeof(_dIndexes), "{FFFFFF}Variable: {FF0000}%s\r\n{FFFFFF}Value: {FF0000}%s\r\n\r\n{AAAAAA}Insert a new value:", sInds[playerid][varEdit[playerid]], sVals[playerid][varEdit[playerid]]);
  156.                     } else {
  157.                         format(_dIndexes, sizeof(_dIndexes), "{FF0000}Warning: This IS NOT an common variable/value line.\r\n\r\n{00FF00}Line: {FFFFFF}%s\r\n\r\nType its new value below:", sInds[playerid][varEdit[playerid]]);
  158.                     }
  159.                    
  160.                     ShowPlayerDialog(playerid, DIALOG_FMVAR, DIALOG_STYLE_INPUT, vals, _dIndexes, "update", "back");
  161.                 } else {
  162.                     if(_dPage[playerid] > 1) _dPage[playerid]--;
  163.                     _showFileVars(playerid, path, _dPage[playerid]);
  164.                 }
  165.             }
  166.         } else if(response == 0) {
  167.             if(_dialogClose[playerid] == 2) return _listDir(_pDir[playerid], 1, playerid, _dPage[playerid]);
  168.             else {
  169.                 if(listitem == 0) {
  170.                     _dPage[playerid]++;
  171.                     _showFileVars(playerid, path, _dPage[playerid]);
  172.                 }
  173.             }
  174.         }
  175.     } else if(dialogid == DIALOG_FMVAR) {
  176.         new text[2000], t;
  177.         format(path, sizeof(path), "%s%s", _pDir[playerid], _currentFile[playerid]);
  178.      
  179.         if(response == 1) {
  180.             if(strlen(sVals[playerid][varEdit[playerid]]) > 0) {
  181.                 format(sVals[playerid][varEdit[playerid]], 20, "%s", inputtext);
  182.             } else {
  183.                 format(sInds[playerid][varEdit[playerid]], 128, "%s", inputtext);
  184.             }
  185.            
  186.             for(t = 0; t < 300; t++) {
  187.                 if(strlen(sInds[playerid][t]) > 0) {
  188.                     if(strlen(sVals[playerid][t]) > 0) {
  189.                         format(text, sizeof(text), "%s%s=%s\n", text, sInds[playerid][t], sVals[playerid][t]);
  190.                     } else {
  191.                         format(text, sizeof(text), "%s%s\n", text, sInds[playerid][t]);
  192.                     }
  193.                 }
  194.             }
  195.            
  196.             new File:ofile = f_open(path, "w");
  197.             f_write(ofile, text);
  198.             f_close(ofile);
  199.  
  200.             _showFileVars(playerid, path, _dPage[playerid]);
  201.         } else {
  202.             format(path, sizeof(path), "%s%s", _pDir[playerid], _currentFile[playerid]);
  203.             _showFileVars(playerid, path, 1);
  204.         }
  205.     }
  206.     return 0;
  207. }
  208. //----------------------------------------------------------------------------------------------------------------------------------------
  209. public OnPlayerCommandText(playerid, cmdtext[])
  210. {
  211.     if(strcmp(cmdtext, "/fileeditor", true) == 0) {
  212.         if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xEE4000FF, "[SERVERE] Only admins can use this command.");
  213.  
  214.         _resetVars(playerid);
  215.         _listDir("./", 1, playerid, 1);
  216.        
  217.         return 1;
  218.     }
  219.     return 0;
  220. }
  221. //----------------------------------------------------------------------------------------------------------------------------------------
  222. forward _showFileVars(playerid, file[], page);
  223. public _showFileVars(playerid, file[], page) {
  224.     new _line[128], x, y, z, _limit, t;
  225.  
  226.     format(_dIndexes, 600, "");
  227.  
  228.     x = 0;
  229.     y = (page - 1) * _itemsPerList;
  230.     z = 0;
  231.     _limit  = y + _itemsPerList;
  232.  
  233.     _dPage[playerid] = page;
  234.  
  235.     format(_dIndexes, sizeof(_dIndexes), "{00FF00}Page %d:\r\n", page);
  236.  
  237.     for(t = 0; t < 300; t++) {
  238.         format(sInds[playerid][t], 20, "");
  239.     }
  240.  
  241.     for(t = 0; t < 300; t++) {
  242.         format(sVals[playerid][t], 20, "");
  243.     }
  244.    
  245.     new File:ofile = f_open(file, "r");
  246.     while(f_read(ofile, _line, 128)) {
  247.         explode(exp, _line, "=");
  248.         if(x >= y && x < _limit) {
  249.             if(strlen(_line) && strlen(exp[1]) > 0) {
  250.                 format(_dIndexes, sizeof(_dIndexes), "%s%s : %s\r\n", _dIndexes, exp[0], exp[1]);
  251.             } else {
  252.                 format(_dIndexes, sizeof(_dIndexes), "%s%s\r\n", _dIndexes, exp[0]);
  253.             }
  254.            
  255.             ++z;
  256.         }
  257.  
  258.         format(sInds[playerid][x], 50, "%s", exp[0]);
  259.         format(sVals[playerid][x], 50, "%s", exp[1]);
  260.  
  261.         ++x;
  262.     }
  263.     if(ofile) f_close(ofile);
  264.  
  265.     format(vals, sizeof(vals), "File %s", file);
  266.  
  267.     if(z < _itemsPerList && page == 1) {
  268.         _dialogClose[playerid] = 1;
  269.         ShowPlayerDialog(playerid,  DIALOG_FMFILE, DIALOG_STYLE_LIST, vals, _dIndexes, "Back", "");
  270.     } else if(z == _itemsPerList && page == 1) {
  271.         _dialogClose[playerid] = 1;
  272.         ShowPlayerDialog(playerid,  DIALOG_FMFILE, DIALOG_STYLE_LIST, vals, _dIndexes, "Back", "Next >>");
  273.     } else if(z < _itemsPerList && page > 1){
  274.         _dialogClose[playerid] = 2;
  275.         ShowPlayerDialog(playerid,  DIALOG_FMFILE, DIALOG_STYLE_LIST, vals, _dIndexes, "<< Prev.", "");
  276.     } else {
  277.         _dialogClose[playerid] = 0;
  278.         ShowPlayerDialog(playerid,  DIALOG_FMFILE, DIALOG_STYLE_LIST, vals, _dIndexes, "<< Prev.", "Next >>");
  279.     }
  280.  
  281.     return 1;
  282. }
  283. //----------------------------------------------------------------------------------------------------------------------------------------
  284. forward _listDir(_dir[], start, playerid, page);
  285. public _listDir(_dir[], start, playerid, page) {
  286.     new dir:_handle, item[40], type, _color[9], _c, _dialogLabel[150], _z, _o;
  287.    
  288.     _handle = dir_open(_dir);
  289.    
  290.     _dPage[playerid] = page;
  291.    
  292.     format(_dirContainer[playerid], _dirContainerSize, "");
  293.    
  294.     start   = start * (page - 1) * _itemsPerList;
  295.     _c      = (page - 1) * _itemsPerList;
  296.     _z      = 0;
  297.     _o      = 0;
  298.    
  299.     format(_pDir[playerid], sizeof(_pDir[]), "%s", _dir);
  300.  
  301.     while(dir_list(_handle, item, type)) {
  302.         if(_z > start && _o <= _itemsPerList - 1) {
  303.             ++_o;
  304.            
  305.             if(type == FM_FILE)     format(_color, sizeof(_color), "%s", "{FFFFFF}");
  306.             else if(type == FM_DIR) {
  307.                 if(strcmp(item, "..", true) == 1) {
  308.                     format(_color, sizeof(_color), "%s", "{FF0000}");
  309.                 } else {
  310.                     format(_color, sizeof(_color), "%s", "{DF00FF}");
  311.                    
  312.                     if(strlen(getLastDir(playerid)) > 0) {
  313.                         format(item, sizeof(item), "/\\ Above directory");
  314.                     } else {
  315.                         format(item, sizeof(item), "");
  316.                     }
  317.                 }
  318.             }
  319.            
  320.             if(strlen(item) > 0) {
  321.                 format(_dirContainer[playerid], _dirContainerSize, "%s%s%s\r\n", _dirContainer[playerid], _color, item);
  322.             }
  323.         }
  324.  
  325.         ++_c;
  326.         ++_z;
  327.     }
  328.    
  329.     format(_dirContainer[playerid], sizeof(_dirContainer[]), "{00FF00}Page %d/%d\r\n%s", page, floatround(float(_z) / float(_itemsPerList), floatround_ceil), _dirContainer[playerid]);
  330.  
  331.     dir_close(_handle);
  332.    
  333.     format(_dialogLabel, sizeof(_dialogLabel), "File Editor - Dir %s", _dir);
  334.    
  335.     if(_z <= _itemsPerList && page == 1) {
  336.         _dialogClose[playerid] = 1;
  337.         ShowPlayerDialog(playerid, DIALOG_FMDIR, DIALOG_STYLE_LIST, _dialogLabel, _dirContainer[playerid], "Close", "");
  338.     } else if(_o == _itemsPerList && page == 1) {
  339.         _dialogClose[playerid] = 1;
  340.         ShowPlayerDialog(playerid, DIALOG_FMDIR, DIALOG_STYLE_LIST, _dialogLabel, _dirContainer[playerid], "Close", "Next >>");
  341.     } else if(_o < _itemsPerList && page > 1){
  342.         _dialogClose[playerid] = 2;
  343.         ShowPlayerDialog(playerid, DIALOG_FMDIR, DIALOG_STYLE_LIST, _dialogLabel, _dirContainer[playerid], "<< Prev.", "");
  344.     } else {
  345.         _dialogClose[playerid] = 0;
  346.         ShowPlayerDialog(playerid, DIALOG_FMDIR, DIALOG_STYLE_LIST, _dialogLabel, _dirContainer[playerid], "<< Prev.", "Next >>");
  347.     }
  348.  
  349.     return 1;
  350. }
  351. //----------------------------------------------------------------------------------------------------------------------------------------
  352. stock explode(aExplode[][], const sSource[], const sDelimiter[] = " ", iVertices = sizeof aExplode, iLength = sizeof aExplode[]){
  353.     new
  354.         iNode,
  355.         iPointer,
  356.         iPrevious = -1,
  357.         iDelimiter = strlen(sDelimiter);
  358.  
  359.     while(iNode < iVertices){
  360.         iPointer = strfind(sSource, sDelimiter, false, iPointer);
  361.  
  362.         if(iPointer == -1){
  363.             strmid(aExplode[iNode], sSource, iPrevious, strlen(sSource), iLength);
  364.             break;
  365.         }
  366.         else {
  367.             strmid(aExplode[iNode], sSource, iPrevious, iPointer, iLength);
  368.         }
  369.  
  370.         iPrevious = (iPointer += iDelimiter);
  371.         ++iNode;
  372.     }
  373.     return iPrevious;
  374. }
  375. //----------------------------------------------------------------------------------------------------------------------------------------
  376. forward _resetVars(playerid);
  377. public _resetVars(playerid) {
  378.     new t;
  379.  
  380.     _dPage[playerid] = 0;
  381.     _dialogClose[playerid] = 0;
  382.     globListitem[playerid] = 0;
  383.     format(_dIndexes, sizeof(_dIndexes), "");
  384.     format(vals, sizeof(vals), "");
  385.  
  386.     for(t = 0; t < 300; t++) {
  387.         format(sInds[playerid][t], 20, "");
  388.     }
  389.  
  390.     for(t = 0; t < 300; t++) {
  391.         format(sVals[playerid][t], 20, "");
  392.     }
  393.    
  394.     for(t = 0; t < sizeof(_lastDir[]); ++t) {
  395.         format(_lastDir[playerid][t], 50, "");
  396.     }
  397.    
  398.     return 1;
  399. }
  400. //----------------------------------------------------------------------------------------------------------------------------------------
  401. forward addLastDir(playerid, dir[]);
  402. public addLastDir(playerid, dir[]) {
  403.     new i;
  404.     for(i = 0; i < sizeof(_lastDir[]); ++i) {
  405.         if(strlen(_lastDir[playerid][i]) == 0) {
  406.             format(_lastDir[playerid][i], 50, "%s", dir);
  407.             break;
  408.         }
  409.     }
  410.    
  411.     return 1;
  412. }
  413. //----------------------------------------------------------------------------------------------------------------------------------------
  414. forward rmLastDir(playerid, dir[]);
  415. public rmLastDir(playerid, dir[]) {
  416.     new i;
  417.    
  418.     for(i = 0; i < sizeof(_lastDir[]); ++i) {
  419.         if(strcmp(_lastDir[playerid][i], dir, true) == 0) {
  420.             format(_lastDir[playerid][i], 50, "");
  421.             break;
  422.         }
  423.     }
  424.    
  425.     return 1;
  426. }
  427. //----------------------------------------------------------------------------------------------------------------------------------------
  428. stock getLastDir(playerid) {
  429.     new dir[50], i;
  430.  
  431.     for(i = 0; i < sizeof(_lastDir[]); ++i) {
  432.         if(strlen(_lastDir[playerid][(i + 1)]) == 0 || (i + 1) > sizeof(_lastDir[])) {
  433.             format(dir, sizeof(dir), "%s", _lastDir[playerid][i]);
  434.             break;
  435.         }
  436.     }
  437.  
  438.     return dir;
  439. }
  440. //----------------------------------------------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement