Advertisement
Papadopolis

Untitled

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