· 6 years ago · Nov 26, 2019, 10:00 PM
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
51enum 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
69new Project[MAX_PLAYERS][e_ProjectData];
70
71enum 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
80new ProjectBars[MAX_PLAYERS][MAX_PLAYER_BARS][e_ProjectBars];
81
82new DB:g_iDatabase;
83
84new DBResult:g_iDatabaseResult;
85main()
86{
87 print("\nProgress Bar Editor by Emmet_ загружен!");
88 print("Используйте команду /bar для создания/редактирования.");
89 print("Автор перевода на русский язык: Kovshevoy\n");
90}
91public 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
104public 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
120public OnPlayerConnect(playerid)
121{
122 ResetProjectData(playerid);
123 return 1;
124}
125
126public OnPlayerDisconnect(playerid, reason)
127{
128 if (Project[playerid][e_ProjectActive])
129 {
130 Project_Close(playerid);
131 }
132 return 1;
133}
134
135public 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
146public 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
272stock 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
294stock 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
312stock 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
338stock 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
365stock 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
390stock 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
480stock 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
503forward ShowProjectMenu(playerid);
504public 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
547stock 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
598stock 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
631forward ShowProgressBarMenu(playerid, PlayerBar:barid);
632public 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
659stock 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
681stock 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
706stock 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
743stock 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
790stock 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
807stock 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
841stock 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
858public 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
1342CMD: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}