Advertisement
Guest User

Progress Bar v2 editor by Emmet_

a guest
Nov 26th, 2019
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 43.33 KB | None | 0 0
  1. /*
  2.  *  Progress bar editor by Emmet_
  3.  *  Made for Southclaw's Progress Bars v2.
  4.  *
  5.  *  Features:
  6.  *  - Ability to adjust all settings, including direction, color, and size.
  7.  *  - Uses SQLite for better organization.
  8.  *  - Supports multiple progress bars.
  9. */
  10.  
  11. #include <a_samp>
  12. #include <crashdetect>
  13. #include <foreach>
  14. //#define FILTERSCRIPT
  15. #include <progress2>
  16. #include <zcmd>
  17.  
  18. #define COLOR_INFO  (0xFFDD00FF)
  19. #define COLOR_ERROR (0xFF5030FF)
  20.  
  21. #define PROJECT_DB_PATH     "projects.db" // Path of the file that stores all of the project names.
  22. #define PROJECT_EXPORT_PATH "%s.pwn" // Path of the export file location.
  23. #define ADMIN_RESTRICTION   false  // Restrict the progress bar editor to RCON admins only?
  24. #define MAX_PROJECT_NAME    24     // Maximum amount of characters in a project name.
  25.  
  26. #define DIALOG_MAIN_MENU        18300
  27. #define DIALOG_LOAD_PROJECT     18301
  28. #define DIALOG_LOAD_CUSTOM      18302
  29. #define DIALOG_DELETE_PROJECT   18303
  30. #define DIALOG_DELETE_CUSTOM    18304
  31. #define DIALOG_DELETE_CONFIRM   18305
  32. #define DIALOG_CREATE_PROJECT   18306
  33. #define DIALOG_PROJECT_MENU     18307
  34. #define DIALOG_BAR_MENU         18308
  35. #define DIALOG_COLOR_INPUT      18309
  36. #define DIALOG_DIRECTION_LIST   18310
  37. #define DIALOG_MAX_VALUE        18311
  38.  
  39. #define LIST_TYPE_LOAD     1
  40. #define LIST_TYPE_DELETE   2
  41.  
  42. #define UPDATE_BAR_POSITION   1
  43. #define UPDATE_BAR_SIZE       2
  44. #define UPDATE_BAR_DIRECTION  3
  45. #define UPDATE_BAR_MAX_VALUE  4
  46. #define UPDATE_BAR_COLOR      5
  47.  
  48. #define EDIT_TYPE_POSITION   1
  49. #define EDIT_TYPE_SIZE       2
  50.  
  51. enum e_ProjectData
  52. {
  53.     // Indicates if a project is active.
  54.     e_ProjectActive,
  55.  
  56.     // Name of the project.
  57.     e_ProjectName[MAX_PROJECT_NAME],
  58.  
  59.     // Name of the project to delete.
  60.     e_ProjectToDelete[MAX_PROJECT_NAME],
  61.  
  62.     // Editing type. (1) Position (2) Size
  63.     e_EditType,
  64.  
  65.     // Index of the selected progress bar, relative to "ProjectBars"
  66.     e_SelectedBar
  67. };
  68.  
  69. new Project[MAX_PLAYERS][e_ProjectData];
  70.  
  71. enum e_ProjectBars
  72. {
  73.     // Database ID of the progress bar's record.
  74.     e_DatabaseID,
  75.  
  76.     // ID of the progress bar.
  77.     PlayerBar:e_ProgressBarID
  78. };
  79.  
  80. new ProjectBars[MAX_PLAYERS][MAX_PLAYER_BARS][e_ProjectBars];
  81.  
  82. new DB:g_iDatabase;
  83.  
  84. new DBResult:g_iDatabaseResult;
  85. main()
  86. {
  87.     print("\nProgress Bar Editor by Emmet_ загружен!");
  88.     print("Используйте команду /bar для создания/редактирования.");
  89.     print("Автор перевода на русский язык: Kovshevoy\n");
  90. }
  91. public OnFilterScriptInit()
  92. {
  93.     foreach(new i: Player)
  94.     {
  95.         if (IsPlayerConnected(i)) ResetProjectData(i);
  96.     }
  97.     g_iDatabase = db_open(PROJECT_DB_PATH);
  98.  
  99.     db_query(g_iDatabase, "CREATE TABLE IF NOT EXISTS `projects` (name VARCHAR("#MAX_PROJECT_NAME"), creator VARCHAR(24))");
  100.     db_query(g_iDatabase, "CREATE TABLE IF NOT EXISTS `bars` (bar_id INTEGER PRIMARY KEY AUTOINCREMENT, project VARCHAR("#MAX_PROJECT_NAME"), x_pos FLOAT, y_pos FLOAT, width FLOAT, height FLOAT, max_value FLOAT, color INTEGER, direction INTEGER, FOREIGN KEY (project) REFERENCES projects(name))");
  101.     return 1;
  102. }
  103.  
  104. public OnFilterScriptExit()
  105. {
  106.     foreach(new i: Player)
  107.     {
  108.         if (Project[i][e_ProjectActive])
  109.         {
  110.             Project_Close(i);
  111.             ShowPlayerDialog(i, -1, DIALOG_STYLE_LIST, " ", " ", " ", "");
  112.         }
  113.     }
  114.     db_close(g_iDatabase);
  115.  
  116.     print("Progress Bar Editor by Emmet_ выгружен!");
  117.     return 1;
  118. }
  119.  
  120. public OnPlayerConnect(playerid)
  121. {
  122.     ResetProjectData(playerid);
  123.     return 1;
  124. }
  125.  
  126. public OnPlayerDisconnect(playerid, reason)
  127. {
  128.     if (Project[playerid][e_ProjectActive])
  129.     {
  130.         Project_Close(playerid);
  131.     }
  132.     return 1;
  133. }
  134.  
  135. public OnPlayerSpawn(playerid)
  136. {
  137.     #if ADMIN_RESTRICTION == true
  138.         if (IsPlayerAdmin(playerid)) SendClientMessage(playerid, COLOR_INFO, "Используйте команду /bar для создания/редактирования!");
  139.     #elseif ADMIN_RESTRICTION == false
  140.         SendClientMessage(playerid, COLOR_INFO, "Используйте команду /bar для создания/редактирования!");
  141.     #endif
  142.  
  143.     return 1;
  144. }
  145.  
  146. public OnPlayerUpdate(playerid)
  147. {
  148.     new
  149.         keys,
  150.         ud,
  151.         lr;
  152.  
  153.     if (Project[playerid][e_ProjectActive] && Project[playerid][e_SelectedBar] != -1)
  154.     {
  155.         new
  156.             PlayerBar:barid = ProjectBars[playerid][Project[playerid][e_SelectedBar]][e_ProgressBarID],
  157.             string[128],
  158.             Float:x,
  159.             Float:y;
  160.  
  161.         GetPlayerKeys(playerid, keys, ud, lr);
  162.  
  163.         GetPlayerProgressBarPos(playerid, barid, x, y);
  164.  
  165.         if (keys & KEY_SECONDARY_ATTACK)
  166.         {
  167.             switch (Project[playerid][e_EditType])
  168.             {
  169.                 case EDIT_TYPE_POSITION:
  170.                 {
  171.                     UpdateProgressBarData(playerid, Project[playerid][e_SelectedBar], UPDATE_BAR_POSITION);
  172.                     SetTimerEx("ShowProgressBarMenu", 300, false, "dd", playerid, _:barid);
  173.  
  174.                     format(string, sizeof(string), "Вы установили позицию индикатору #%d.", Project[playerid][e_SelectedBar]);
  175.                     SendClientMessage(playerid, COLOR_INFO, string);
  176.                 }
  177.                 case EDIT_TYPE_SIZE:
  178.                 {
  179.                     UpdateProgressBarData(playerid, Project[playerid][e_SelectedBar], UPDATE_BAR_SIZE);
  180.                     SetTimerEx("ShowProgressBarMenu", 300, false, "dd", playerid, _:barid);
  181.  
  182.                     format(string, sizeof(string), "Вы установил размер индикатору #%d.", Project[playerid][e_SelectedBar]);
  183.                     SendClientMessage(playerid, COLOR_INFO, string);
  184.                 }
  185.             }
  186.             TogglePlayerControllable(playerid, 1);
  187.             SetPlayerProgressBarValue(playerid, barid, 50.0);
  188.  
  189.             Project[playerid][e_EditType] = 0;
  190.         }
  191.         if (ud == KEY_UP)
  192.         {
  193.             if (Project[playerid][e_EditType] == EDIT_TYPE_POSITION)
  194.             {
  195.                 if (keys == KEY_SPRINT)
  196.                     SetPlayerProgressBarPos(playerid, barid, x, y - 5.0);
  197.                 else
  198.                     SetPlayerProgressBarPos(playerid, barid, x, y - 1.0);
  199.             }
  200.             else if (Project[playerid][e_EditType] == EDIT_TYPE_SIZE)
  201.             {
  202.                 if (keys == KEY_SPRINT)
  203.                     SetPlayerProgressBarHeight(playerid, barid, GetPlayerProgressBarHeight(playerid, barid) - 1.0);
  204.                 else
  205.                     SetPlayerProgressBarHeight(playerid, barid, GetPlayerProgressBarHeight(playerid, barid) - 0.5);
  206.             }
  207.         }
  208.         if (ud == KEY_DOWN)
  209.         {
  210.             if (Project[playerid][e_EditType] == EDIT_TYPE_POSITION)
  211.             {
  212.                 if (keys == KEY_SPRINT)
  213.                     SetPlayerProgressBarPos(playerid, barid, x, y + 5.0);
  214.                 else
  215.                     SetPlayerProgressBarPos(playerid, barid, x, y + 1.0);
  216.             }
  217.             else if (Project[playerid][e_EditType] == EDIT_TYPE_SIZE)
  218.             {
  219.                 if (keys == KEY_SPRINT)
  220.                     SetPlayerProgressBarHeight(playerid, barid, GetPlayerProgressBarHeight(playerid, barid) + 1.0);
  221.                 else
  222.                     SetPlayerProgressBarHeight(playerid, barid, GetPlayerProgressBarHeight(playerid, barid) + 0.5);
  223.             }
  224.         }
  225.         if (lr == KEY_LEFT)
  226.         {
  227.             if (Project[playerid][e_EditType] == EDIT_TYPE_POSITION)
  228.             {
  229.                 if (keys == KEY_SPRINT)
  230.                     SetPlayerProgressBarPos(playerid, barid, x - 5.0, y);
  231.                 else
  232.                     SetPlayerProgressBarPos(playerid, barid, x - 1.0, y);
  233.             }
  234.             else if (Project[playerid][e_EditType] == EDIT_TYPE_SIZE)
  235.             {
  236.                 if (keys == KEY_SPRINT)
  237.                     SetPlayerProgressBarWidth(playerid, barid, GetPlayerProgressBarWidth(playerid, barid) - 1.0);
  238.                 else
  239.                     SetPlayerProgressBarWidth(playerid, barid, GetPlayerProgressBarWidth(playerid, barid) - 0.5);
  240.             }
  241.         }
  242.         if (lr == KEY_RIGHT)
  243.         {
  244.             if (Project[playerid][e_EditType] == EDIT_TYPE_POSITION)
  245.             {
  246.                 if (keys == KEY_SPRINT)
  247.                     SetPlayerProgressBarPos(playerid, barid, x + 5.0, y);
  248.                 else
  249.                     SetPlayerProgressBarPos(playerid, barid, x + 1.0, y);
  250.             }
  251.             else if (Project[playerid][e_EditType] == EDIT_TYPE_SIZE)
  252.             {
  253.                 if (keys == KEY_SPRINT)
  254.                     SetPlayerProgressBarWidth(playerid, barid, GetPlayerProgressBarWidth(playerid, barid) + 1.0);
  255.                 else
  256.                     SetPlayerProgressBarWidth(playerid, barid, GetPlayerProgressBarWidth(playerid, barid) + 0.5);
  257.             }
  258.         }
  259.     }
  260.     return 1;
  261. }
  262.  
  263. /*
  264.     Function:
  265.         ResetProjectData
  266.     Parameters:
  267.         playerid - The player to reset the data for.
  268.     Returns:
  269.         No significant value.
  270. */
  271.  
  272. stock ResetProjectData(playerid)
  273. {
  274.     for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  275.     {
  276.         ProjectBars[playerid][i][e_DatabaseID] = 0;
  277.         ProjectBars[playerid][i][e_ProgressBarID] = INVALID_PLAYER_BAR_ID;
  278.     }
  279.     Project[playerid][e_ProjectActive] = 0;
  280.     Project[playerid][e_ProjectName] = 0;
  281.     Project[playerid][e_EditType] = 0;
  282.     Project[playerid][e_SelectedBar] = -1;
  283. }
  284.  
  285. /*
  286.     Function:
  287.         Project_ExportPath
  288.     Parameters:
  289.         name[] - Name of the project.
  290.     Returns:
  291.         The export file path for the specified project name.
  292. */
  293.  
  294. stock Project_ExportPath(name[])
  295. {
  296.     new
  297.         path[MAX_PROJECT_NAME + 14];
  298.  
  299.     format(path, sizeof(path), PROJECT_EXPORT_PATH, name);
  300.     return path;
  301. }
  302.  
  303. /*
  304.     Function:
  305.         Project_Exists
  306.     Parameters:
  307.         name[] - Name of the project.
  308.     Returns:
  309.         Returns 1 if the project file exists.
  310. */
  311.  
  312. stock Project_Exists(name[])
  313. {
  314.     new
  315.         string[128],
  316.         rows;
  317.  
  318.     format(string, sizeof(string), "SELECT `name` FROM `projects` WHERE `name` = '%s'", name);
  319.  
  320.     g_iDatabaseResult = db_query(g_iDatabase, string);
  321.  
  322.     rows = db_num_rows(g_iDatabaseResult);
  323.  
  324.     db_free_result(g_iDatabaseResult);
  325.  
  326.     return (rows > 0);
  327. }
  328.  
  329. /*
  330.     Function:
  331.         Project_Remove
  332.     Parameters:
  333.         name[] - Name of the project.
  334.     Returns:
  335.         Returns 1 if the project was removed.
  336. */
  337.  
  338. stock Project_Remove(name[])
  339. {
  340.     if (Project_Exists(name))
  341.     {
  342.         new
  343.             string[128];
  344.  
  345.         format(string, sizeof(string), "DELETE FROM projects WHERE name = '%s'", name);
  346.         db_query(g_iDatabase, string);
  347.  
  348.         format(string, sizeof(string), "DELETE FROM bars WHERE project = '%s'", name);
  349.         db_query(g_iDatabase, string);
  350.  
  351.         return 1;
  352.     }
  353.     return 0;
  354. }
  355.  
  356. /*
  357.     Function:
  358.         Project_IsOpen
  359.     Parameters:
  360.         name[] - Name of the project.
  361.     Returns:
  362.         Returns 1 if the project is opened by another player.
  363. */
  364.  
  365. stock Project_IsOpen(name[])
  366. {
  367.     foreach(new i: Player)
  368.     {
  369.         if (!IsPlayerConnected(i)) continue;
  370.  
  371.         if (Project[i][e_ProjectActive] && !strcmp(Project[i][e_ProjectName], name, true))
  372.         {
  373.             return 1;
  374.         }
  375.     }
  376.     return 0;
  377. }
  378.  
  379. /*
  380.     Function:
  381.         Project_Open
  382.     Parameters:
  383.         playerid - The player that is editing the project.
  384.         name[] - Name of the project.
  385.     Returns:
  386.         1: if the project was successfully opened.
  387.         0: if another player is already editing that project.
  388. */
  389.  
  390. stock Project_Open(playerid, name[])
  391. {
  392.     new
  393.         str[128],
  394.         rows
  395.     ;
  396.     if (!Project_Exists(name))
  397.     {
  398.         // If it doesn't exist in the database, then add it in there.
  399.         GetPlayerName(playerid, str, sizeof(str));
  400.  
  401.         format(str, sizeof(str), "INSERT INTO projects (name, creator) VALUES('%s', '%s')", name, str);
  402.         db_query(g_iDatabase, str);
  403.     }
  404.     else if (Project_IsOpen(name)) // Another player is already editing this project.
  405.     {
  406.         return 0;
  407.     }
  408.  
  409.     new
  410.         Float:x,
  411.         Float:y,
  412.         Float:width,
  413.         Float:height,
  414.         Float:maxvalue,
  415.         color,
  416.         direction
  417.     ;
  418.  
  419.     format(str, sizeof(str), "SELECT * FROM `bars` WHERE `project` = '%s'", name);
  420.  
  421.     g_iDatabaseResult = db_query(g_iDatabase, str);
  422.  
  423.     rows = db_num_rows(g_iDatabaseResult);
  424.  
  425.     for (new i = 0; i < rows; i ++)
  426.     {
  427.         if (i >= MAX_PLAYER_BARS)
  428.         {
  429.             printf("Внимание: проект \"%s\" содержит %d индикаторов; Лимит %d.", name, rows, MAX_PLAYER_BARS);
  430.             break;
  431.         }
  432.         db_get_field_assoc(g_iDatabaseResult, "bar_id", str, sizeof(str));
  433.         ProjectBars[playerid][i][e_DatabaseID] = strval(str);
  434.  
  435.         db_get_field_assoc(g_iDatabaseResult, "x_pos", str, sizeof(str));
  436.         x = floatstr(str);
  437.  
  438.         db_get_field_assoc(g_iDatabaseResult, "y_pos", str, sizeof(str));
  439.         y = floatstr(str);
  440.  
  441.         db_get_field_assoc(g_iDatabaseResult, "width", str, sizeof(str));
  442.         width = floatstr(str);
  443.  
  444.         db_get_field_assoc(g_iDatabaseResult, "height", str, sizeof(str));
  445.         height = floatstr(str);
  446.  
  447.         db_get_field_assoc(g_iDatabaseResult, "max_value", str, sizeof(str));
  448.         maxvalue = floatstr(str);
  449.  
  450.         db_get_field_assoc(g_iDatabaseResult, "color", str, sizeof(str));
  451.         color = strval(str);
  452.  
  453.         db_get_field_assoc(g_iDatabaseResult, "direction", str, sizeof(str));
  454.         direction = strval(str);
  455.  
  456.         ProjectBars[playerid][i][e_ProgressBarID] = CreatePlayerProgressBar(playerid, x, y, width, height, color, maxvalue, direction);
  457.  
  458.         SetPlayerProgressBarValue(playerid, ProjectBars[playerid][i][e_ProgressBarID], 50.0);
  459.         ShowPlayerProgressBar(playerid, ProjectBars[playerid][i][e_ProgressBarID]);
  460.  
  461.         db_next_row(g_iDatabaseResult);
  462.     }
  463.     db_free_result(g_iDatabaseResult);
  464.  
  465.     Project[playerid][e_ProjectActive] = 1;
  466.  
  467.     return strcat(Project[playerid][e_ProjectName], name, MAX_PROJECT_NAME);
  468. }
  469.  
  470. /*
  471.     Function:
  472.         ShowProjectMainMenu
  473.     Parameters:
  474.         playerid - The player to show the main menu for.
  475.     Returns:
  476.         1: if the menu was successfully shown.
  477.         0: if the player is not editing any projects.
  478. */
  479.  
  480. stock ShowProjectMainMenu(playerid)
  481. {
  482.     if (Project[playerid][e_ProjectActive])
  483.     {
  484.         ShowProjectMenu(playerid);
  485.     }
  486.     else
  487.     {
  488.         ShowPlayerDialog(playerid, DIALOG_MAIN_MENU, DIALOG_STYLE_LIST, "Главное меню", "Создать проект\nЗагрузить проект\nУдалить проект", "Выбрать", "Отмена");
  489.     }
  490.     return 1;
  491. }
  492.  
  493. /*
  494.     Function:
  495.         ShowProjectMenu
  496.     Parameters:
  497.         playerid - The player to show the menu for.
  498.     Returns:
  499.         1: if the menu was successfully shown.
  500.         0: if the player is not editing any projects.
  501. */
  502.  
  503. forward ShowProjectMenu(playerid);
  504. public ShowProjectMenu(playerid)
  505. {
  506.     if (Project[playerid][e_ProjectActive])
  507.     {
  508.         new
  509.             string[1024];
  510.  
  511.         format(string, sizeof(string), "Создание прогресс-бара\nЭкспорт проекта\nЗакрыть проект");
  512.  
  513.         for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  514.         {
  515.             if (ProjectBars[playerid][i][e_ProgressBarID] == INVALID_PLAYER_BAR_ID)
  516.                 continue;
  517.  
  518.             switch (GetPlayerProgressBarDirection(playerid, ProjectBars[playerid][i][e_ProgressBarID]))
  519.             {
  520.                 case BAR_DIRECTION_LEFT:
  521.                     format(string, sizeof(string), "%s\n- индикатор #%d - Направление: Влево", string, i);
  522.                 case BAR_DIRECTION_RIGHT:
  523.                     format(string, sizeof(string), "%s\n- индикатор #%d - Направление: Вправо", string, i);
  524.                 case BAR_DIRECTION_UP:
  525.                     format(string, sizeof(string), "%s\n- индикатор #%d - Направление: Вверх", string, i);
  526.                 case BAR_DIRECTION_DOWN:
  527.                     format(string, sizeof(string), "%s\n- индикатор #%d - Направление: Вниз", string, i);
  528.             }
  529.         }
  530.         ShowPlayerDialog(playerid, DIALOG_PROJECT_MENU, DIALOG_STYLE_LIST, "Меню проекта", string, "Выбрать", "Отмена");
  531.         return 1;
  532.     }
  533.     return 0;
  534. }
  535.  
  536. /*
  537.     Function:
  538.         Project_ShowList
  539.     Parameters:
  540.         playerid - The player to show the list to.
  541.         type - The type of the list.
  542.     Returns:
  543.         1: if the list was successfully shown.
  544.         0: if there wasn't anything to display.
  545. */
  546.  
  547. stock Project_ShowList(playerid, type)
  548. {
  549.     new
  550.         string[MAX_PROJECT_NAME + 3],
  551.         buffer[1024],
  552.         rows;
  553.  
  554.     strcat(buffer, "Список проектов\n");
  555.  
  556.     g_iDatabaseResult = db_query(g_iDatabase, "SELECT `name` FROM projects");
  557.  
  558.     rows = db_num_rows(g_iDatabaseResult);
  559.  
  560.     for (new i = 0; i < rows; i ++)
  561.     {
  562.         db_get_field(g_iDatabaseResult, 0, string, sizeof(string));
  563.         db_next_row(g_iDatabaseResult);
  564.  
  565.         strcat(buffer, string);
  566.         strcat(buffer, "\n");
  567.     }
  568.     db_free_result(g_iDatabaseResult);
  569.  
  570.     if (isnull(buffer))
  571.     {
  572.         return 0;
  573.     }
  574.     switch (type)
  575.     {
  576.         case LIST_TYPE_LOAD:
  577.         {
  578.             ShowPlayerDialog(playerid, DIALOG_LOAD_PROJECT, DIALOG_STYLE_LIST, "Загрузить проект", buffer, "Загрузить", "Отмена");
  579.         }
  580.         case LIST_TYPE_DELETE:
  581.         {
  582.             ShowPlayerDialog(playerid, DIALOG_DELETE_PROJECT, DIALOG_STYLE_LIST, "Удалить проект", buffer, "Удалить", "Отмена");
  583.         }
  584.     }
  585.     return 1;
  586. }
  587.  
  588. /*
  589.     Function:
  590.         Project_Close
  591.     Parameters:
  592.         playerid - The player to close the project for.
  593.     Returns:
  594.         1: if the project was closed.
  595.         0: if there wasn't any project loaded.
  596. */
  597.  
  598. stock Project_Close(playerid)
  599. {
  600.     if (Project[playerid][e_ProjectActive])
  601.     {
  602.         if (Project[playerid][e_EditType] > 0)
  603.         {
  604.             TogglePlayerControllable(playerid, 1);
  605.         }
  606.         for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  607.         {
  608.             if (ProjectBars[playerid][i][e_ProgressBarID] != INVALID_PLAYER_BAR_ID)
  609.             {
  610.                 HidePlayerProgressBar(playerid, ProjectBars[playerid][i][e_ProgressBarID]);
  611.                 DestroyPlayerProgressBar(playerid, ProjectBars[playerid][i][e_ProgressBarID]);
  612.             }
  613.         }
  614.         ResetProjectData(playerid);
  615.         return 1;
  616.     }
  617.     return 0;
  618. }
  619.  
  620. /*
  621.     Function:
  622.         ShowProgressBarMenu
  623.     Parameters:
  624.         playerid - The player to show the menu to.
  625.         PlayerBar:barid - The ID of the player bar.
  626.     Returns:
  627.         1: if the menu was shown.
  628.         0: if the player bar doesn't exist.
  629. */
  630.  
  631. forward ShowProgressBarMenu(playerid, PlayerBar:barid);
  632. public ShowProgressBarMenu(playerid, PlayerBar:barid)
  633. {
  634.     if (Project[playerid][e_ProjectActive])
  635.     {
  636.         new
  637.             string[512],
  638.             title[24];
  639.  
  640.         Project[playerid][e_SelectedBar] = GetProgressBarInternalID(playerid, barid);
  641.         format(title, sizeof(title), "Индикатор #%d", Project[playerid][e_SelectedBar]);
  642.  
  643.         format(string, sizeof(string), "Изменить позицию\nИзменить размер\nИзменить цвет\nИзменить направление (%s)\nИзменить максимальное значение (%.4f)\nСкопировать индикатор\nУдалить этот индикатор", GetDirectionFromType(GetPlayerProgressBarDirection(playerid, barid)), GetPlayerProgressBarMaxValue(playerid, barid));
  644.         ShowPlayerDialog(playerid, DIALOG_BAR_MENU, DIALOG_STYLE_LIST, title, string, "Выбрать", "Назад");
  645.     }
  646.     return 1;
  647. }
  648.  
  649. /*
  650.     Function:
  651.         GetProgressBarInternalID
  652.     Parameters:
  653.         playerid - The player ID of the progress bar.
  654.         PlayerBar:barid - The ID of the progress bar.
  655.     Returns:
  656.         The index of "ProjectBars" that contains the progress bar ID.
  657. */
  658.  
  659. stock GetProgressBarInternalID(playerid, PlayerBar:barid)
  660. {
  661.     for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  662.     {
  663.         if (ProjectBars[playerid][i][e_ProgressBarID] == barid)
  664.         {
  665.             return i;
  666.         }
  667.     }
  668.     return -1;
  669. }
  670.  
  671. /*
  672.     Function:
  673.         DuplicateProgresssBar
  674.     Parameters:
  675.         playerid - The player ID to duplicate the progress bar for.
  676.         index - The index of the bar, relative to "ProjectBars".
  677.     Returns:
  678.         The index relative to "ProjectBars" that contains the new progress bar ID.
  679. */
  680.  
  681. stock DuplicateProgressBar(playerid, index)
  682. {
  683.     if (Project[playerid][e_ProjectActive])
  684.     {
  685.         new
  686.             PlayerBar:barid = ProjectBars[playerid][index][e_ProgressBarID],
  687.             Float:x,
  688.             Float:y;
  689.  
  690.         GetPlayerProgressBarPos(playerid, barid, x, y);
  691.         return AddBarToProject(playerid, x, y, GetPlayerProgressBarWidth(playerid, barid), GetPlayerProgressBarHeight(playerid, barid), GetPlayerProgressBarMaxValue(playerid, barid), GetPlayerProgressBarColour(playerid, barid), GetPlayerProgressBarDirection(playerid, barid));
  692.     }
  693.     return -1;
  694. }
  695.  
  696. /*
  697.     Function:
  698.         AddBarToProject
  699.     Parameters:
  700.         playerid - The player ID to add the bar for.
  701.         ... - Parameters. Check "CreatePlayerProgressBar" for more details.
  702.     Returns:
  703.         The index relative to "ProjectBars" that contains the new progress bar ID.
  704. */
  705.  
  706. stock AddBarToProject(playerid, Float:x = 280.0, Float:y = 200.0, Float:width = 55.5, Float:height = 3.2, Float:max_value = 100.0, color = -1429936641, direction = BAR_DIRECTION_RIGHT)
  707. {
  708.     new
  709.         string[160];
  710.  
  711.     if (!Project[playerid][e_ProjectActive])
  712.     {
  713.         return -1;
  714.     }
  715.     for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  716.     {
  717.         if (ProjectBars[playerid][i][e_ProgressBarID] != INVALID_PLAYER_BAR_ID) continue;
  718.  
  719.         format(string, sizeof(string), "INSERT INTO `bars` VALUES(null, '%s', %.6f, %.6f, %.6f, %.6f, %.4f, %d, %d)", Project[playerid][e_ProjectName], x, y, width, height, max_value, color, direction);
  720.         db_query(g_iDatabase, string);
  721.  
  722.         ProjectBars[playerid][i][e_ProgressBarID] = CreatePlayerProgressBar(playerid, x, y, width, height, color, max_value, direction);
  723.         ProjectBars[playerid][i][e_DatabaseID] = db_last_insert_id(g_iDatabase, "bars");
  724.  
  725.         SetPlayerProgressBarValue(playerid, ProjectBars[playerid][i][e_ProgressBarID], 50.0);
  726.         ShowPlayerProgressBar(playerid, ProjectBars[playerid][i][e_ProgressBarID]);
  727.         return i;
  728.     }
  729.     return -1;
  730. }
  731.  
  732. /*
  733.     Function:
  734.         UpdateProgressBarData
  735.     Parameters:
  736.         playerid - The player ID to add the bar for.
  737.         index - Index of the progress bar, relative to "ProjectBars".
  738.         type - Type of data to update in the database.
  739.     Returns:
  740.         Returns 1 if the data was successfully updated.
  741. */
  742.  
  743. stock UpdateProgressBarData(playerid, index, type)
  744. {
  745.     new
  746.         PlayerBar:barid = ProjectBars[playerid][index][e_ProgressBarID],
  747.         string[128];
  748.  
  749.     if (IsValidPlayerProgressBar(playerid, barid))
  750.     {
  751.         switch (type)
  752.         {
  753.             case UPDATE_BAR_POSITION:
  754.             {
  755.                 new
  756.                     Float:x,
  757.                     Float:y;
  758.  
  759.                 GetPlayerProgressBarPos(playerid, barid, x, y);
  760.  
  761.                 format(string, sizeof(string), "UPDATE `bars` SET `x_pos` = %.6f, `y_pos` = %.6f WHERE `bar_id` = %d", x, y, ProjectBars[playerid][index][e_DatabaseID]);
  762.                 db_query(g_iDatabase, string);
  763.             }
  764.             case UPDATE_BAR_SIZE:
  765.             {
  766.                 format(string, sizeof(string), "UPDATE `bars` SET `width` = %.6f, `height` = %.6f WHERE `bar_id` = %d", GetPlayerProgressBarWidth(playerid, barid), GetPlayerProgressBarHeight(playerid, barid), ProjectBars[playerid][index][e_DatabaseID]);
  767.                 db_query(g_iDatabase, string);
  768.             }
  769.             case UPDATE_BAR_DIRECTION:
  770.             {
  771.                 format(string, sizeof(string), "UPDATE `bars` SET `direction` = %d WHERE `bar_id` = %d", GetPlayerProgressBarDirection(playerid, barid), ProjectBars[playerid][index][e_DatabaseID]);
  772.                 db_query(g_iDatabase, string);
  773.             }
  774.             case UPDATE_BAR_MAX_VALUE:
  775.             {
  776.                 format(string, sizeof(string), "UPDATE `bars` SET `max_value` = %.6f WHERE `bar_id` = %d", GetPlayerProgressBarMaxValue(playerid, barid), ProjectBars[playerid][index][e_DatabaseID]);
  777.                 db_query(g_iDatabase, string);
  778.             }
  779.             case UPDATE_BAR_COLOR:
  780.             {
  781.                 format(string, sizeof(string), "UPDATE `bars` SET `color` = %d WHERE `bar_id` = %d", GetPlayerProgressBarColour(playerid, barid), ProjectBars[playerid][index][e_DatabaseID]);
  782.                 db_query(g_iDatabase, string);
  783.             }
  784.         }
  785.         return 1;
  786.     }
  787.     return 0;
  788. }
  789.  
  790. stock GetDirectionFromType(direction)
  791. {
  792.     new
  793.         str[7];
  794.  
  795.     if (direction == BAR_DIRECTION_LEFT)
  796.         str = "Влево";
  797.     else if (direction == BAR_DIRECTION_RIGHT)
  798.         str = "Вправо";
  799.     else if (direction == BAR_DIRECTION_UP)
  800.         str = "Вверх";
  801.     else if (direction == BAR_DIRECTION_DOWN)
  802.         str = "Вниз";
  803.  
  804.     return str;
  805. }
  806.  
  807. stock StrToHex(str[])
  808. {
  809.     // Credits to Y_Less.
  810.  
  811.     new
  812.         i,
  813.         value;
  814.  
  815.     if (str[0] == '0' && (str [1] == 'x' || str [1] == 'X'))
  816.         i = 2;
  817.  
  818.     while (str[i])
  819.     {
  820.         value <<= 4;
  821.  
  822.         switch (str[i])
  823.         {
  824.             case '0'..'9':
  825.                 value |= str [i] - '0';
  826.  
  827.             case 'A'..'F':
  828.                 value |= str [i] - 'A' + 10;
  829.  
  830.             case 'a'..'f':
  831.                 value |= str [i] - 'a' + 10;
  832.  
  833.             default:
  834.                 return 0;
  835.         }
  836.         ++ i;
  837.     }
  838.     return value;
  839. }
  840.  
  841. stock db_last_insert_id(DB:database, const table[])
  842. {
  843.     new
  844.         DBResult:result,
  845.         string[64];
  846.  
  847.     format(string, sizeof(string), "SELECT last_insert_rowid() FROM %s", table);
  848.  
  849.     result = db_query(database, string);
  850.  
  851.     db_get_field(result, 0, string, sizeof(string));
  852.  
  853.     db_free_result(result);
  854.  
  855.     return strval(string);
  856. }
  857.  
  858. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  859. {
  860.     new
  861.         string[255],
  862.         PlayerBar:barid,
  863.         index = -1;
  864.  
  865.     if (Project[playerid][e_ProjectActive] && (index = Project[playerid][e_SelectedBar]) != -1)
  866.     {
  867.         barid = ProjectBars[playerid][Project[playerid][e_SelectedBar]][e_ProgressBarID];
  868.     }
  869.  
  870.     switch (dialogid)
  871.     {
  872.         case DIALOG_MAIN_MENU:
  873.         {
  874.             if (response)
  875.             {
  876.                 switch (listitem)
  877.                 {
  878.                     case 0: // Create new project
  879.                     {
  880.                         ShowPlayerDialog(playerid, DIALOG_CREATE_PROJECT, DIALOG_STYLE_INPUT, "Создать новый проект", "Пожалуйста, введите название вашего нового проекта ниже: \nИмя должно содержать только буквы, цифры и пробелы.", "Далее", "Назад");
  881.                     }
  882.                     case 1: // Load existing project
  883.                     {
  884.                         Project_ShowList(playerid, LIST_TYPE_LOAD);
  885.                     }
  886.                     case 2: // Delete project
  887.                     {
  888.                         new
  889.                             success = Project_ShowList(playerid, LIST_TYPE_DELETE);
  890.  
  891.                         if (!success) return SendClientMessage(playerid, COLOR_ERROR, "Не найдено ни одного проекта");
  892.                     }
  893.                 }
  894.             }
  895.         }
  896.         case DIALOG_CREATE_PROJECT:
  897.         {
  898.             if (response)
  899.             {
  900.                 if (isnull(inputtext))
  901.                 {
  902.                     return ShowPlayerDialog(playerid, DIALOG_CREATE_PROJECT, DIALOG_STYLE_INPUT, "Создать новый проект", "Пожалуйста, введите название вашего нового проекта ниже: \nИмя должно содержать только буквы, цифры и пробелы.", "Далее", "Назад");
  903.                 }
  904.                 else if (strlen(inputtext) > 32)
  905.                 {
  906.                     return ShowPlayerDialog(playerid, DIALOG_CREATE_PROJECT, DIALOG_STYLE_INPUT, "Создать новый проект", "Пожалуйста, введите название вашего нового проекта ниже: \nИмя должно содержать только буквы, цифры и пробелы.", "Далее", "Назад");
  907.                 }
  908.                 else if (Project_Exists(inputtext))
  909.                 {
  910.                     return ShowPlayerDialog(playerid, DIALOG_CREATE_PROJECT, DIALOG_STYLE_INPUT, "Создать новый проект", "Указанное имя проекта уже используется!\n\nПожалуйста, введите название вашего нового проекта ниже: \nИмя должно содержать только буквы, цифры и пробелы.", "Далее", "Назад");
  911.                 }
  912.                 else
  913.                 {
  914.                     for (new i = 0, l = strlen(inputtext); i < l; i ++)
  915.                     {
  916.                         switch (inputtext[i])
  917.                         {
  918.                             case '\\', '/', ':', '*', '"', '?', '<', '>', '|', '\'':
  919.                             {
  920.                                 return ShowPlayerDialog(playerid, DIALOG_CREATE_PROJECT, DIALOG_STYLE_INPUT, "Создать новый проект", "Вы ввели недопустимые символы. Пожалуйста удалите их и попробуйте снова.\n\nПожалуйста, введите название вашего нового проекта ниже: \nИмя должно содержать только буквы, цифры и пробелы.", "Далее", "Назад");
  921.                             }
  922.                         }
  923.                     }
  924.                     format(string, sizeof(string), "Вы создали проект \"%s\".", inputtext);
  925.                     SendClientMessage(playerid, COLOR_INFO, string);
  926.  
  927.                     Project_Open(playerid, inputtext);
  928.                     ShowProjectMenu(playerid);
  929.                 }
  930.             }
  931.             else
  932.             {
  933.                 ShowProjectMainMenu(playerid);
  934.             }
  935.         }
  936.         case DIALOG_LOAD_PROJECT:
  937.         {
  938.             if (response)
  939.             {
  940.                 if (!listitem) // Custom name...
  941.                 {
  942.                     ShowPlayerDialog(playerid, DIALOG_LOAD_CUSTOM, DIALOG_STYLE_INPUT, "Загрузить проект", "Пожалуйста, введите название проекта, который вы хотите загрузить:", "Далее", "Назад");
  943.                 }
  944.                 else
  945.                 {
  946.                     new
  947.                         pos = -1;
  948.  
  949.                     // strip extra characters
  950.                     if ((pos = strfind(inputtext, "\r")) != -1) strdel(inputtext, pos, pos + 1);
  951.                     if ((pos = strfind(inputtext, "\n")) != -1) strdel(inputtext, pos, pos + 1);
  952.  
  953.                     format(string, sizeof(string), "Вы загрузили проект \"%s\".", inputtext);
  954.                     SendClientMessage(playerid, COLOR_INFO, string);
  955.  
  956.                     Project_Open(playerid, inputtext);
  957.                     ShowProjectMenu(playerid);
  958.                 }
  959.             }
  960.             else
  961.             {
  962.                 ShowProjectMainMenu(playerid);
  963.             }
  964.         }
  965.         case DIALOG_LOAD_CUSTOM:
  966.         {
  967.             if (response)
  968.             {
  969.                 if (isnull(inputtext) || strlen(inputtext) > 32)
  970.                 {
  971.                     ShowPlayerDialog(playerid, DIALOG_LOAD_CUSTOM, DIALOG_STYLE_INPUT, "Загрузить проект", "Пожалуйста, введите название проекта, который вы хотите загрузить:", "Далее", "Назад");
  972.                 }
  973.                 else if (!Project_Exists(inputtext))
  974.                 {
  975.                     ShowPlayerDialog(playerid, DIALOG_LOAD_CUSTOM, DIALOG_STYLE_INPUT, "Загрузить проект", "Указанное имя проекта не существует.\n\nПожалуйста, введите название проекта, который вы хотите загрузить:", "Далее", "Назад");
  976.                 }
  977.                 else if (Project_IsOpen(inputtext))
  978.                 {
  979.                     ShowPlayerDialog(playerid, DIALOG_LOAD_CUSTOM, DIALOG_STYLE_INPUT, "Загрузить проект", "Указанный проект редактируется другим игроком.\n\nПожалуйста, введите название проекта, который вы хотите загрузить:", "Далее", "Назад");
  980.                 }
  981.                 else
  982.                 {
  983.                     format(string, sizeof(string), "Вы загрузили проект \"%s\".", inputtext);
  984.                     SendClientMessage(playerid, COLOR_INFO, string);
  985.  
  986.                     Project_Open(playerid, inputtext);
  987.                     ShowProjectMenu(playerid);
  988.                 }
  989.             }
  990.             else
  991.             {
  992.                 Project_ShowList(playerid, LIST_TYPE_LOAD);
  993.             }
  994.         }
  995.         case DIALOG_DELETE_PROJECT:
  996.         {
  997.             if (response)
  998.             {
  999.                 if (!listitem) // Custom name...
  1000.                 {
  1001.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CUSTOM, DIALOG_STYLE_INPUT, "Удалить проект", "Пожалуйста, введите название проекта, который вы хотите удалить:", "Далее", "Назад");
  1002.                 }
  1003.                 else
  1004.                 {
  1005.                     new
  1006.                         pos = -1;
  1007.  
  1008.                     // strip extra characters
  1009.                     if ((pos = strfind(inputtext, "\r")) != -1) strdel(inputtext, pos, pos + 1);
  1010.                     if ((pos = strfind(inputtext, "\n")) != -1) strdel(inputtext, pos, pos + 1);
  1011.  
  1012.                     Project[playerid][e_ProjectToDelete] = 0;
  1013.                     strcat(Project[playerid][e_ProjectToDelete], inputtext, MAX_PROJECT_NAME);
  1014.  
  1015.                     format(string, sizeof(string), "Вы собираетесь удалить проект \"%s\"!\nВы не сможете восстановить проект после его удаления.", inputtext);
  1016.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CONFIRM, DIALOG_STYLE_MSGBOX, "Удалить проект", string, "Да", "Нет");
  1017.                 }
  1018.             }
  1019.             else
  1020.             {
  1021.                 ShowProjectMainMenu(playerid);
  1022.             }
  1023.         }
  1024.         case DIALOG_DELETE_CUSTOM:
  1025.         {
  1026.             if (response)
  1027.             {
  1028.                 if (isnull(inputtext) || strlen(inputtext) > 32)
  1029.                 {
  1030.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CUSTOM, DIALOG_STYLE_INPUT, "Удалить проект", "Пожалуйста, введите название проекта, который вы хотите удалить:", "Далее", "Назад");
  1031.                 }
  1032.                 else if (!Project_Exists(inputtext))
  1033.                 {
  1034.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CUSTOM, DIALOG_STYLE_INPUT, "Удалить проект", "Указанное имя проекта не существует.\n\nПожалуйста, введите название проекта, который вы хотите удалить:", "Далее", "Назад");
  1035.                 }
  1036.                 else if (Project_IsOpen(inputtext))
  1037.                 {
  1038.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CUSTOM, DIALOG_STYLE_INPUT, "Удалить проект", "Указанный проект редактируется другим игроком.\n\nПожалуйста, введите название проекта, который вы хотите удалить:", "Далее", "Назад");
  1039.                 }
  1040.                 else
  1041.                 {
  1042.                     Project[playerid][e_ProjectToDelete] = 0;
  1043.                     strcat(Project[playerid][e_ProjectToDelete], inputtext, MAX_PROJECT_NAME);
  1044.  
  1045.                     format(string, sizeof(string), "Вы собираетесь удалить проект \"%s\"!\nВы не сможете восстановить проект после его удаления.", inputtext);
  1046.                     ShowPlayerDialog(playerid, DIALOG_DELETE_CONFIRM, DIALOG_STYLE_MSGBOX, "Удалить проект", string, "Да", "Нет");
  1047.                 }
  1048.             }
  1049.             else
  1050.             {
  1051.                 Project_ShowList(playerid, LIST_TYPE_LOAD);
  1052.             }
  1053.         }
  1054.         case DIALOG_DELETE_CONFIRM:
  1055.         {
  1056.             if (response)
  1057.             {
  1058.                 Project_Remove(Project[playerid][e_ProjectToDelete]);
  1059.  
  1060.                 format(string, sizeof(string), "Вы удалили проект \"%s\".", Project[playerid][e_ProjectToDelete]);
  1061.                 SendClientMessage(playerid, COLOR_INFO, string);
  1062.  
  1063.                 Project[playerid][e_ProjectToDelete] = 0;
  1064.             }
  1065.             else
  1066.             {
  1067.                 ShowProjectMainMenu(playerid);
  1068.             }
  1069.         }
  1070.         case DIALOG_PROJECT_MENU:
  1071.         {
  1072.             if (response)
  1073.             {
  1074.                 switch (listitem)
  1075.                 {
  1076.                     case 0: // Create progress bar...
  1077.                     {
  1078.                         new
  1079.                             id = AddBarToProject(playerid);
  1080.  
  1081.                         if (id != -1)
  1082.                         {
  1083.                             format(string, sizeof(string), "Вы создали прогресс-индикатор #%d.", id);
  1084.                             SendClientMessage(playerid, COLOR_INFO, string);
  1085.  
  1086.                             ShowProjectMenu(playerid);
  1087.                             return 1;
  1088.                         }
  1089.                         else
  1090.                         {
  1091.                             SendClientMessage(playerid, COLOR_ERROR, "Пожалуйста, измените параметр \"MAX_PLAYER_BARS\" в файле \"progress2.inc\" чтобы создать больше прогресс-индикаторов.");
  1092.                             ShowProjectMenu(playerid);
  1093.                         }
  1094.                     }
  1095.                     case 1: // Export project...
  1096.                     {
  1097.                         new
  1098.                             File:file = fopen(Project_ExportPath(Project[playerid][e_ProjectName]), io_write),
  1099.                             Float:x,
  1100.                             Float:y,
  1101.                             date[6]
  1102.                         ;
  1103.  
  1104.                         if (file)
  1105.                         {
  1106.                             getdate(date[0], date[1], date[2]);
  1107.                             gettime(date[3], date[4], date[5]);
  1108.  
  1109.                             format(string, sizeof(string), "/*\r\n * Название проекта: %s\r\n * Дата: %02d/%02d/%d @ %02d:%02d:%02d\r\n\r\n * Код ниже должен использоваться для Progress Bar V2 include.\r\n *\r\n*/\r\n\r\n", Project[playerid][e_ProjectName], date[2], date[1], date[0], date[3], date[4], date[5]);
  1110.                             fwrite(file, string);
  1111.  
  1112.                             fwrite(file, "#include <a_samp>\r\n#include <progress2>\r\n\r\n");
  1113.  
  1114.                             for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  1115.                             {
  1116.                                 if (ProjectBars[playerid][i][e_ProgressBarID] != INVALID_PLAYER_BAR_ID)
  1117.                                 {
  1118.                                     format(string, sizeof(string), "new PlayerBar:Bar%d[MAX_PLAYERS];\r\n", i);
  1119.                                     fwrite(file, string);
  1120.                                 }
  1121.                             }
  1122.                             fwrite(file, "\r\npublic OnPlayerConnect(playerid)\r\n{\r\n");
  1123.  
  1124.                             for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  1125.                             {
  1126.                                 if (ProjectBars[playerid][i][e_ProgressBarID] == INVALID_PLAYER_BAR_ID)
  1127.                                     continue;
  1128.  
  1129.                                 GetPlayerProgressBarPos(playerid, ProjectBars[playerid][i][e_ProgressBarID], x, y);
  1130.  
  1131.                                 format(string, sizeof(string), "    Bar%d[playerid] = CreatePlayerProgressBar(playerid, %.6f, %.6f, %.6f, %.6f, %d, %.4f, %d);\r\n",
  1132.                                     i,
  1133.                                     x,
  1134.                                     y,
  1135.                                     GetPlayerProgressBarWidth(playerid, ProjectBars[playerid][i][e_ProgressBarID]),
  1136.                                     GetPlayerProgressBarHeight(playerid, ProjectBars[playerid][i][e_ProgressBarID]),
  1137.                                     GetPlayerProgressBarColour(playerid, ProjectBars[playerid][i][e_ProgressBarID]),
  1138.                                     GetPlayerProgressBarMaxValue(playerid, ProjectBars[playerid][i][e_ProgressBarID]),
  1139.                                     GetPlayerProgressBarDirection(playerid, ProjectBars[playerid][i][e_ProgressBarID])
  1140.                                 );
  1141.  
  1142.                                 fwrite(file, string);
  1143.                             }
  1144.                             fwrite(file, "\r\n    return 1;\r\n}\r\n\r\npublic OnPlayerSpawn(playerid)\r\n{\r\n");
  1145.  
  1146.                             for (new i = 0; i < MAX_PLAYER_BARS; i ++)
  1147.                             {
  1148.                                 if (ProjectBars[playerid][i][e_ProgressBarID] == INVALID_PLAYER_BAR_ID)
  1149.                                     continue;
  1150.  
  1151.                                 format(string, sizeof(string), "    ShowPlayerProgressBar(playerid, Bar%d[playerid]);\r\n", i);
  1152.                                 fwrite(file, string);
  1153.                             }
  1154.                             fwrite(file, "\r\n    return 1;\r\n}\r\n");
  1155.                             fclose(file);
  1156.  
  1157.                             format(string, sizeof(string), "Проект был экспортирован в \"%s\".", Project_ExportPath(Project[playerid][e_ProjectName]));
  1158.                             SendClientMessage(playerid, COLOR_INFO, string);
  1159.  
  1160.                             ShowProjectMenu(playerid);
  1161.                         }
  1162.                     }
  1163.                     case 2: // Close project...
  1164.                     {
  1165.                         format(string, sizeof(string), "Вы закрыли проект \"%s\".", Project[playerid][e_ProjectName]);
  1166.                         SendClientMessage(playerid, COLOR_INFO, string);
  1167.  
  1168.                         Project_Close(playerid);
  1169.                         ShowProjectMainMenu(playerid);
  1170.                     }
  1171.                     default: // Player selected a bar
  1172.                     {
  1173.                         index = strval(inputtext[7]);
  1174.  
  1175.                         if (!IsValidPlayerProgressBar(playerid, ProjectBars[playerid][index][e_ProgressBarID]))
  1176.                         {
  1177.                             SendClientMessage(playerid, COLOR_ERROR, "Упс! Кажется, здесь проблема ... Пожалуйста, свяжитесь с Emmet.");
  1178.                         }
  1179.                         else
  1180.                         {
  1181.                             ShowProgressBarMenu(playerid, ProjectBars[playerid][index][e_ProgressBarID]);
  1182.                         }
  1183.                     }
  1184.                 }
  1185.             }
  1186.         }
  1187.         case DIALOG_BAR_MENU:
  1188.         {
  1189.             if (response)
  1190.             {
  1191.                 switch (listitem)
  1192.                 {
  1193.                     case 0: // Изменить позицию
  1194.                     {
  1195.                         Project[playerid][e_EditType] = EDIT_TYPE_POSITION;
  1196.                         TogglePlayerControllable(playerid, 0);
  1197.  
  1198.                         format(string, sizeof(string), "Вы изменяете позицию индикатору #%d's. Используйте клавиши со стрелками для перемещения панели и нажмите Enter, когда закончите.", index);
  1199.                         SendClientMessage(playerid, COLOR_INFO, string);
  1200.                     }
  1201.                     case 1: // Изменить размер
  1202.                     {
  1203.                         Project[playerid][e_EditType] = EDIT_TYPE_SIZE;
  1204.                         TogglePlayerControllable(playerid, 0);
  1205.  
  1206.                         format(string, sizeof(string), "Вы изменяете размер индикатору #%d's. Используйте клавиши со стрелками для настройки размера и нажмите Enter, когда закончите.", index);
  1207.                         SendClientMessage(playerid, COLOR_INFO, string);
  1208.                     }
  1209.                     case 2: // Изменить цвет
  1210.                     {
  1211.                         ShowPlayerDialog(playerid, DIALOG_COLOR_INPUT, DIALOG_STYLE_INPUT, "Изменить цвет", "Пожалуйста, введите новый цвет для этого индикатора ниже:\nВы должны ввести цвет формата HEX. Белый цвет в формате HEX: FFFFFFFF.", "Далее", "Назад");
  1212.                     }
  1213.                     case 3: // Изменить направление
  1214.                     {
  1215.                         ShowPlayerDialog(playerid, DIALOG_DIRECTION_LIST, DIALOG_STYLE_LIST, "Изменить направление", "Вправо\nВлево\nВверх\nВниз", "Выбрать", "Назад");
  1216.                     }
  1217.                     case 4: // Изменить максимальное значение
  1218.                     {
  1219.                         format(string, sizeof(string), "Пожалуйста, введите новое максимальное значение для этого бара ниже (текущее: %.4f):", GetPlayerProgressBarMaxValue(playerid, barid));
  1220.                         ShowPlayerDialog(playerid, DIALOG_MAX_VALUE, DIALOG_STYLE_INPUT, "Изменить максимальное значение", string, "Далее", "Назад");
  1221.                     }
  1222.                     case 5: // Скопировать бар
  1223.                     {
  1224.                         new
  1225.                             id = DuplicateProgressBar(playerid, index);
  1226.  
  1227.                         if (id != -1)
  1228.                         {
  1229.                             format(string, sizeof(string), "Вы скопировали индикатор #%d (новый ID: #%d).", index, id);
  1230.                             SendClientMessage(playerid, COLOR_INFO, string);
  1231.  
  1232.                             ShowProjectMenu(playerid);
  1233.                         }
  1234.                         else
  1235.                         {
  1236.                             SendClientMessage(playerid, COLOR_ERROR, "Пожалуйста, измените параметр \"MAX_PLAYER_BARS\" в файле \"progress2.inc\" чтобы создать больше прогресс-индикаторов.");
  1237.                             ShowProjectMenu(playerid);
  1238.                         }
  1239.                     }
  1240.                     case 6: // Удалить этот бар
  1241.                     {
  1242.                         format(string, sizeof(string), "DELETE FROM `bars` WHERE `bar_id` = %d", ProjectBars[playerid][index][e_DatabaseID]);
  1243.                         db_query(g_iDatabase, string);
  1244.  
  1245.                         HidePlayerProgressBar(playerid, barid);
  1246.                         DestroyPlayerProgressBar(playerid, barid);
  1247.  
  1248.                         format(string, sizeof(string), "Вы удалили индикатор #%d.", index);
  1249.                         SendClientMessage(playerid, COLOR_INFO, string);
  1250.  
  1251.                         ProjectBars[playerid][index][e_ProgressBarID] = INVALID_PLAYER_BAR_ID;
  1252.                         ProjectBars[playerid][index][e_DatabaseID] = 0;
  1253.  
  1254.                         Project[playerid][e_SelectedBar] = -1;
  1255.  
  1256.                         return ShowProjectMenu(playerid);
  1257.                     }
  1258.                 }
  1259.             }
  1260.             else
  1261.             {
  1262.                 ShowProjectMenu(playerid);
  1263.             }
  1264.         }
  1265.         case DIALOG_COLOR_INPUT:
  1266.         {
  1267.             if (response)
  1268.             {
  1269.                 if (isnull(inputtext) || (strlen(inputtext) != 6 && strlen(inputtext) != 8))
  1270.                 {
  1271.                     ShowPlayerDialog(playerid, DIALOG_COLOR_INPUT, DIALOG_STYLE_INPUT, "Изменить цвет", "Пожалуйста, введите новый цвет для этого индикатора ниже:\nВы должны ввести цвет формата HEX. Белый цвет в формате HEX: FFFFFFFF.", "Далее", "Назад");
  1272.                 }
  1273.                 else
  1274.                 {
  1275.                     new color = StrToHex(inputtext);
  1276.  
  1277.                     SetPlayerProgressBarColour(playerid, barid, color);
  1278.  
  1279.                     ShowPlayerProgressBar(playerid, barid);
  1280.                     UpdateProgressBarData(playerid, index, UPDATE_BAR_COLOR);
  1281.  
  1282.                     format(string, sizeof(string), "Вы установили индикатору #%d's новый цвет {%06x}%s.", index, color >>> 8, inputtext);
  1283.                     SendClientMessage(playerid, COLOR_INFO, string);
  1284.  
  1285.                     ShowProgressBarMenu(playerid, barid);
  1286.                 }
  1287.             }
  1288.             else
  1289.             {
  1290.                 ShowProgressBarMenu(playerid, barid);
  1291.             }
  1292.         }
  1293.         case DIALOG_DIRECTION_LIST:
  1294.         {
  1295.             if (response)
  1296.             {
  1297.                 SetPlayerProgressBarDirection(playerid, barid, listitem);
  1298.                 UpdateProgressBarData(playerid, index, UPDATE_BAR_DIRECTION);
  1299.  
  1300.                 format(string, sizeof(string), "Вы изменили направление движения индикатору #%d's на %s.", index, GetDirectionFromType(listitem));
  1301.                 SendClientMessage(playerid, COLOR_INFO, string);
  1302.  
  1303.                 ShowProgressBarMenu(playerid, barid);
  1304.             }
  1305.             else
  1306.             {
  1307.                 ShowProgressBarMenu(playerid, barid);
  1308.             }
  1309.         }
  1310.         case DIALOG_MAX_VALUE:
  1311.         {
  1312.             if (response)
  1313.             {
  1314.                 if (isnull(inputtext))
  1315.                 {
  1316.                     format(string, sizeof(string), "Пожалуйста, введите новое максимальное значение для этого бара ниже (текущее: %.4f):", GetPlayerProgressBarMaxValue(playerid, barid));
  1317.                     ShowPlayerDialog(playerid, DIALOG_MAX_VALUE, DIALOG_STYLE_INPUT, "Изменить максимальное значение", string, "Далее", "Назад");
  1318.                 }
  1319.                 else
  1320.                 {
  1321.                     new
  1322.                         Float:max_value = floatstr(inputtext);
  1323.  
  1324.                     SetPlayerProgressBarMaxValue(playerid, barid, max_value);
  1325.                     UpdateProgressBarData(playerid, index, UPDATE_BAR_MAX_VALUE);
  1326.  
  1327.                     format(string, sizeof(string), "Вы изменили максимальное значение индикатору #%d's на %.4f.", index, max_value);
  1328.                     SendClientMessage(playerid, COLOR_INFO, string);
  1329.  
  1330.                     ShowProgressBarMenu(playerid, barid);
  1331.                 }
  1332.             }
  1333.             else
  1334.             {
  1335.                 ShowProgressBarMenu(playerid, barid);
  1336.             }
  1337.         }
  1338.     }
  1339.     return 0;
  1340. }
  1341.  
  1342. CMD:bar(playerid, params[])
  1343. {
  1344.     #if ADMIN_RESTRICTION == true
  1345.         if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_ERROR, "Вы должны быть RCON администратором, чтобы использовать редактор.");
  1346.     #endif
  1347.  
  1348.     if (Project[playerid][e_EditType] > 0)
  1349.     {
  1350.         return SendClientMessage(playerid, COLOR_ERROR, "Вы должны закончить редактирование, прежде чем сможете использовать эту команду.");
  1351.     }
  1352.     ShowProjectMainMenu(playerid);
  1353.     return 1;
  1354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement