farruhrich

Система репортов и вопросов MySQL

10 posts in this topic

Система репортов и вопросов на диалогах с хранением данных в базе MySQL. Система так сделана что на один вопрос/репрот игрок получит ответ/рассмотрение от одного админа. Для другого админа занятые вопросы/репорты в списке не показываются.

У игрока тоже есть список с его репортами/вопросами и статусом. 

 

И так преступим к вшиванию в мод.

 

В include вставляем

Спойлер

#include <a_samp>
#include <a_mysql>                // MySQL
#include <zcmd>                    // by Zeex
#include <sscanf2>
#include <foreach>

 

К define добавляем

Спойлер

#define T_VOPROS                        "vopros"        // Таблица вопросов от игроков
#define T_REPORT                        "report"        // Таблица репортов от игроков
 

#define VOPROSLIMIT 5            // /vopros (Лимит вопросов для каждого игрока)
#define MAX_ANS                            1000             // МАКСИМАЛЬНОЕ КОЛ-ВО ВОПРОСОВ НА СЕРВЕРЕ
#define MAX_REP                            1000             // МАКСИМАЛЬНОЕ КОЛ-ВО РЕПОРТОВ НА СЕРВЕРЕ
 

//Макросы
new format_string[144]; 
#define SCM(%0,%1,%2,%3)       format(format_string, sizeof(format_string),%2,%3) && SendClientMessage(%0, %1, format_string) 
#define SRM(%0,%1,%2)          format(format_string, sizeof(format_string),%1,%2) && SendReportMessage(%0, format_string) 


#define COLOR_LIGHTRED 0xFF6347AA
#define COLOR_GREY 0xC7B486AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_LIGHTBLUE 0x33CCFFAA

 

Спойлер

new PlayerName[MAX_PLAYER_NAME];    // Переменная для имени
new MyAnses[MAX_PLAYERS];         // /vopros (Количество заданных игроком вопросов за сессии игры)
new DOUBLEPLUS[MAX_PLAYERS];     // Счётчик для формирования списков через БД
new TempNumber[MAX_PLAYERS];    // Временное число можно хранить (Для удобства)
new LastPlayers[MAX_PLAYERS];
new TotalPlayers[MAX_PLAYERS];
new OstatokRes[MAX_PLAYERS], Result[MAX_PLAYERS];
new TableLineID[MAX_PLAYERS][1000];     // Хранит уникальный ID из БД при формировании списка
new GlobalString[3326];                // Глобальная переменая, для диалогов 2696
 

//MySQL
new MySQL:database;
new DialogQuery[600];                // строновая переменная для запросов MySQL
//------------------------------------------------

enum e_REPORT_INFO
{
    repID,
    RepRespondentName[24],
    Player[24],
    ReportDate[20],
    Report[144],
    ReportStatus,
    AdminReserved[24]
}
new ReportInfo[MAX_REP][e_REPORT_INFO];

enum e_VOPROS_INFO
{
    ansID,
    Player[24],
    VoprosDate[20],
    Vopros[144],
    Admins[24],
    OtvetData[20],
    Otvet[144],
    AnsRespondentName[24]
}
new VoprosInfo[MAX_ANS][e_VOPROS_INFO];
new AnsListChanged;
new ReportListChanged;

 

enum pInfo
{
    pID,
    pAdmin,
    pName[30],
};
new PlayerInfo[MAX_PLAYERS][pInfo]

 

Спойлер

    if(MyAnses[playerid] > 0)
    {
        mysql_format(database, DialogQuery, sizeof(DialogQuery), "DELETE FROM "T_VOPROS" WHERE Player = '%s'", PlayerInfo[playerid][pName]);
        mysql_tquery(database, DialogQuery);
        foreach(new i : Player) // Обновляем админам список вопросов, так как игрок выходит и его вопросы удаляются
        {
            if(GetPVarInt(i,"AnsListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_alist(i, "\0");
        }
    }

 

В ставляем туда где у вас в моде обнуление, обычно оно при коннекте игрока к серверу в OnPlayerConnect

Спойлер

MyAnses[playerid]                                 = 0; // /vopros (Количество заданных игроком вопросов за сессии игры)

 

Спойлер

    switch(dialogid)
    {
    case 35: // /report
        {
            if(response)
            {
                while(strfind(inputtext,"%",true)!=-1)
                {
                    strdel(inputtext,strfind(inputtext,"%",true),strfind(inputtext,"%",true)+2);
                }
                if(!strlen(inputtext))return ShowPlayerDialog(playerid,35,DIALOG_STYLE_INPUT,"{FFBF40}Жалоба","{FFFFFF}Введите своё сообщения для администрации сервера\nОно должно быть кратким и ясным\n\n{66CC66}Если вы хотите подать жалобу на игрока\nОбезательно узажите его ID и причину жалобы","Отправить","{FF0000}Отмена");
                mysql_format(database, DialogQuery, sizeof(DialogQuery), "INSERT INTO "T_REPORT" (Player,Report_Date,Report) VALUES ('%s',CURDATE(),'%s')", PlayerInfo[playerid][pName], (inputtext));
                mysql_tquery(database, DialogQuery);
                SRM(-1,"{00FF00}%s[%i]: {FFFF00}%s", PlayerInfo[playerid][pName], playerid, (inputtext));
                SendClientMessage(playerid, -1, "Ваша жалоба отправлена администрации сервера. Когда администрация займётся её рассмотрением, вам придёт оповещение.");
                ReportListChanged++; // Сигнал о том что есть изменения в списке репортов
            }
            return true;
        }
    case 36: // /vopros
        {
            if(response)
            {
                if(!strlen(inputtext))return ShowPlayerDialog(playerid,36,DIALOG_STYLE_INPUT,"{FFBF40}Вопрос","{FFFFFF}Здесь вы можите задать вопрос Администрации","Отправить","{FF0000}Отмена");
                mysql_format(database, DialogQuery, sizeof(DialogQuery), "INSERT INTO "T_VOPROS" (Player,Vopros_Date,Vopros) VALUES ('%s',CURDATE(),'%s')", PlayerInfo[playerid][pName], (inputtext));
                mysql_tquery(database, DialogQuery);
                SRM(COLOR_LIGHTBLUE,"> Вопрос от %s[%d]: %s",PlayerInfo[playerid][pName], playerid, (inputtext));
                SendClientMessage(playerid, COLOR_YELLOW, "Ваш вопрос отправлен администрации сервера. Когда администрация ответит на ваш вопрос, вам поступит уведомление.");
                AnsListChanged++; // Сигнал о том что есть изменения в списке вопросов
                MyAnses[playerid]++;
            }
        }
    case 80: // /alist - Список вопросов для администрации
        {
            if(!response) return DeletePVar(playerid, "AnsListStatus"), TotalPlayers[playerid] = 0;
            if(!strcmp(inputtext, "Далее...", false) || !strcmp(inputtext, "Назад...", false))
            {
                if(!strcmp(inputtext, "Назад...", false)) TotalPlayers[playerid] -= (10 + LastPlayers[playerid]);
                cmd_alist(playerid, "\0");
                return 1;
            }
            else
            {
                Result[playerid] = listitem+1; 
                if(TotalPlayers[playerid] > 10)
                {
                    OstatokRes[playerid] = TotalPlayers[playerid] % 10;
                    if(OstatokRes[playerid] != 0)
                    {
                        Result[playerid] = (TotalPlayers[playerid] - OstatokRes[playerid]) + (listitem+1);
                        //PlayerInfo[playerid][aNumberRang] = Result[playerid]+listitem;
                    }
                    else Result[playerid] = (TotalPlayers[playerid]-10)+(listitem+1);
                }
                TotalPlayers[playerid] = 0;     
                // Код
                SetPVarInt(playerid, "AnsListStatus",2); // Открываем доступ к окошку с ИНФО о вопросе
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_VOPROS" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadVoprosList", "i", playerid);
            }
        }
    case 81: // /alist - отправка ответа от админа
        {
            if(response) // Посылаем ответ игроку
            {
                if(!strlen(inputtext))
                {
                    SetPVarInt(playerid, "AnsListStatus",2); // Открываем доступ к окошку с ИНФО о вопросе
                    format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_VOPROS" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                    mysql_tquery(database, DialogQuery, "@LoadVoprosList", "i", playerid);
                    return 1;
                }
                SetPVarInt(playerid, "AnsListStatus", 3); // Ключ на выдачу ответа игроку, если он онлайн
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_VOPROS" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadVoprosList", "is", playerid, (inputtext));
            }
            else // Передумал отвечать
            {
                format(DialogQuery, sizeof(DialogQuery), "UPDATE `"T_VOPROS"` SET `AnsRespondent` = 'Нет' WHERE `ID` = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                DeletePVar(playerid, "AnsListStatus");
                cmd_alist(playerid, "\0");
                foreach(new i : Player) // Обновляем другим админам список вопросов, так как этот вопрос теперь свободен 
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"AnsListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_alist(i, "\0");
                }
            }
        }

    case 82: // /alist - Выбирает ответ из списка ответов ( Действия игрока ) 
        {
            if(!response) return DeletePVar(playerid, "AnsListStatus"), TotalPlayers[playerid] = 0;
            if(!strcmp(inputtext, "Далее...", false) || !strcmp(inputtext, "Назад...", false))
            {
                if(!strcmp(inputtext, "Назад...", false)) TotalPlayers[playerid] -= (10 + LastPlayers[playerid]);
                cmd_alist(playerid, "\0");
                return 1;
            }
            else
            {
                Result[playerid] = listitem+1; 
                if(TotalPlayers[playerid] > 10)
                {
                    OstatokRes[playerid] = TotalPlayers[playerid] % 10;
                    if(OstatokRes[playerid] != 0)
                    {
                        Result[playerid] = (TotalPlayers[playerid] - OstatokRes[playerid]) + (listitem+1);
                        //PlayerInfo[playerid][aNumberRang] = Result[playerid]+listitem;
                    }
                    else Result[playerid] = (TotalPlayers[playerid]-10)+(listitem+1);
                }
                TotalPlayers[playerid] = 0;     
                // Код
                SetPVarInt(playerid, "AnsListStatus",4); // Открываем доступ к окошку с ИНФО о вопросе для игрока
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_VOPROS" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadVoprosList", "i", playerid);
            }
        }
    case 83: // /alist - Игрок смотрит ответ полученный от админа
        {
            if(response) // Удаляем ответ, так как он просмотрен
            {
                mysql_format(database, DialogQuery, sizeof(DialogQuery), "DELETE FROM "T_VOPROS" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                DeletePVar(playerid, "AnsListStatus");
            }
        }
        
        //-----------------
        //-----------------
        //-----------------
        
    case 84: // /rlist - Список жалоб для администрации
        {
            if(!response) return DeletePVar(playerid, "ReportListStatus"), TotalPlayers[playerid] = 0;
            if(!strcmp(inputtext, "Далее...", false) || !strcmp(inputtext, "Назад...", false))
            {
                if(!strcmp(inputtext, "Назад...", false)) TotalPlayers[playerid] -= (10 + LastPlayers[playerid]);
                cmd_rlist(playerid, "\0");
                return 1;
            }
            else
            {
                Result[playerid] = listitem+1; 
                if(TotalPlayers[playerid] > 10)
                {
                    OstatokRes[playerid] = TotalPlayers[playerid] % 10;
                    if(OstatokRes[playerid] != 0)
                    {
                        Result[playerid] = (TotalPlayers[playerid] - OstatokRes[playerid]) + (listitem+1);
                        //PlayerInfo[playerid][aNumberRang] = Result[playerid]+listitem;
                    }
                    else Result[playerid] = (TotalPlayers[playerid]-10)+(listitem+1);
                }
                TotalPlayers[playerid] = 0;     
                // Код
                SetPVarInt(playerid, "ReportListStatus",2); // Открываем доступ к окошку с ИНФО о репорте
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_REPORT" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
            }
        }
    case 85: // /rlist - взятие на рассмотрение жалобы от от игрока админом
        {
            if(response) // Берём жалобу игрока на рассмотрение
            {
                SetPVarInt(playerid, "ReportListStatus",3); // Ключ для взятие жалобы на рассмотрение
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_REPORT" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
            }
            else // Передумал рассматривать жалобу
            {
                format(DialogQuery, sizeof(DialogQuery), "UPDATE "T_REPORT" SET RepRespondent = 'Нет', Status = '0' WHERE ID = '%d' LIMIT 1", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                DeletePVar(playerid, "ReportListStatus");
                cmd_rlist(playerid, "\0");
                foreach(new i : Player) // Обновляем другим админам список репортов, так как этот репорт теперь занят 
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"ReportListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_rlist(i, "\0");
                }
            }
        }
    case 86: // /rlist - окно с взятой на рассмотрение жалобой ( открывается у админа, взявшего жалобу )
        {
            if(!response) // Кнопка "Завершить" для завершения работы над жалобой
            {
                SetPVarInt(playerid, "ReportListStatus",5); // Ключ для завершения рассмотрения жалобы
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_REPORT" WHERE ID = '%d'", GetPVarInt(playerid,"ReportRunned"));
                mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
            }
        }
        
    case 87: // /rlist - Выбирает репорт из списка репортов ( Действия игрока ) 
        {
            if(!response) return DeletePVar(playerid, "ReportListStatus"), TotalPlayers[playerid] = 0;
            if(!strcmp(inputtext, "Далее...", false) || !strcmp(inputtext, "Назад...", false))
            {
                if(!strcmp(inputtext, "Назад...", false)) TotalPlayers[playerid] -= (10 + LastPlayers[playerid]);
                cmd_rlist(playerid, "\0");
                return 1;
            }
            else
            {
                Result[playerid] = listitem+1; 
                if(TotalPlayers[playerid] > 10)
                {
                    OstatokRes[playerid] = TotalPlayers[playerid] % 10;
                    if(OstatokRes[playerid] != 0)
                    {
                        Result[playerid] = (TotalPlayers[playerid] - OstatokRes[playerid]) + (listitem+1);
                        //PlayerInfo[playerid][aNumberRang] = Result[playerid]+listitem;
                    }
                    else Result[playerid] = (TotalPlayers[playerid]-10)+(listitem+1);
                }
                TotalPlayers[playerid] = 0;     
                // Код
                SetPVarInt(playerid, "ReportListStatus",6); // Ключ для открытия ИНФО о своем репорте ( Для игрока )
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_REPORT" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
            }
        }
    case 88: // /rlist - Смотрим репорт от админа
        {
            if(response) // Удаляем ответ, так как он просмотрен
            {
                mysql_format(database, DialogQuery, sizeof(DialogQuery), "DELETE FROM "T_REPORT" WHERE ID = '%d'", TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
            }
        }
    }    

 

Далее в конец мода

 

Спойлер

CMD:report(playerid,params[])return cmd_rep(playerid,params);
CMD:rep(playerid,params[])
{
    ShowPlayerDialog(playerid,35,DIALOG_STYLE_INPUT,"{FFBF40}Жалоба","{FFFFFF}Введите своё сообщение для администрации сервера\nОно должно быть кратким и ясным\n\n{66CC66}Если вы хотите подать жалобу на игрока,\nобязательно укажите его ID и причину жалобы","Отправить","{FF0000}Отмена");
    return true;
}
CMD:answer(playerid,params[])return cmd_ans(playerid,params);
CMD:ans(playerid,params[])
{
    //if(MyAnses[playerid] == VOPROSLIMIT) return SendClientMessage(playerid, COLOR_WHITE, "Извините, сервер сейчас перегружен и не может обработать ваш вопрос. Повторите попытку позже.");
    if(MyAnses[playerid] == VOPROSLIMIT) return SendClientMessage(playerid, COLOR_WHITE, "Вы исчерпали лимит вопросов. Для просмотра и удаления ваших вопросов используйте /anslist");
    ShowPlayerDialog(playerid,36,DIALOG_STYLE_INPUT,"{FFBF40}Вопрос","{FFFFFF}Здесь вы можите задать вопрос Администрации","Отправить","{FF0000}Отмена");
    return true;
}

CMD:replist(playerid,params[])return cmd_rlist(playerid,params);
CMD:rlist(playerid,params[])
{
    switch(PlayerInfo[playerid][pAdmin])
    {
    case 0: // Для игрока
        {
            SetPVarInt(playerid, "ReportListStatus",1); // Ключ для открытия списка репортов
            format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM `"T_REPORT"` WHERE Player = '%s' LIMIT %i, 10", PlayerInfo[playerid][pName], TotalPlayers[playerid]); // Показываем только вопросы заданные игроком
            mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);    
        }
    default: // Для админов
        {
            if(GetPVarInt(playerid,"ReportRunned") > 0) // Статус взятого репорта на рассмотрение
            {
                SetPVarInt(playerid, "ReportListStatus",4); // Ключ для открытия ИНФО о взятом на рассмотрение репорте
                format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM `"T_REPORT"` WHERE ID = '%d' LIMIT 1", GetPVarInt(playerid,"ReportRunned")); // Запрашиваем из таблицы нужный репорт
                mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
                return 1;
            }
            SetPVarInt(playerid, "ReportListStatus",1); // Ключ для открытия списка репортов
            format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM `"T_REPORT"` WHERE Status <= '1' LIMIT %i, 10", TotalPlayers[playerid]); // Не пропускаем не отвеченные репорты
            mysql_tquery(database, DialogQuery, "@LoadReportList", "i", playerid);
            if(ReportListChanged > 0) // Если требуется обновление списка репортов так как добавились новые репорты
            {
                // Обновляем другим админам список репортов
                ReportListChanged = 0;
                foreach(new i : Player)
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"ReportListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_rlist(i, "\0");
                }
            }
        }
    }    
    return true;
}

@LoadReportList(playerid);
@LoadReportList(playerid)
{  
    new rows, str[256], ReportSTR[40];
    cache_get_row_count(rows);
    if(rows)
    {
        cache_get_value_name_int(0, "ID", ReportInfo[DOUBLEPLUS[playerid]][repID]);
        cache_get_value_name(0, "RepRespondent", ReportInfo[DOUBLEPLUS[playerid]][RepRespondentName], 24);
        cache_get_value_name(0, "Player", ReportInfo[DOUBLEPLUS[playerid]][Player], 24);
        cache_get_value_name(0, "Report_Date", ReportInfo[DOUBLEPLUS[playerid]][ReportDate], 20);
        cache_get_value_name(0, "Report", ReportInfo[DOUBLEPLUS[playerid]][Report], 144);
        cache_get_value_name_int(0, "Status", ReportInfo[DOUBLEPLUS[playerid]][ReportStatus]);
        cache_get_value_name(0, "AdminReserved", ReportInfo[DOUBLEPLUS[playerid]][AdminReserved], 24);
        switch(GetPVarInt(playerid,"ReportListStatus"))
        {
        case 1: // Показать список
            {
                DOUBLEPLUS[playerid] = TotalPlayers[playerid];
                switch(PlayerInfo[playerid][pAdmin])
                {
                case 0: format(str, sizeof(str), "Жалоба\tДата\tСтатус\n");
                default: format(str, sizeof(str), "Отправитель\tЖалоба\tДата\n");
                }
                GlobalString[0] = EOS;
                strcat(GlobalString,str);
                for(new i = 1; i <= rows; i++)
                {
                    DOUBLEPLUS[playerid]++;
                    cache_get_value_name_int(i-1, "ID", ReportInfo[DOUBLEPLUS[playerid]][repID]);
                    cache_get_value_name(i-1, "RepRespondent", ReportInfo[DOUBLEPLUS[playerid]][RepRespondentName], 24);
                    cache_get_value_name(i-1, "Player", ReportInfo[DOUBLEPLUS[playerid]][Player], 24);
                    cache_get_value_name(i-1, "Report_Date", ReportInfo[DOUBLEPLUS[playerid]][ReportDate], 20);
                    cache_get_value_name(i-1, "Report", ReportInfo[DOUBLEPLUS[playerid]][Report], 144);
                    cache_get_value_name_int(i-1, "Status", ReportInfo[DOUBLEPLUS[playerid]][ReportStatus]);
                    cache_get_value_name(i-1, "AdminReserved", ReportInfo[DOUBLEPLUS[playerid]][AdminReserved], 24);
                    
                    TableLineID[playerid][DOUBLEPLUS[playerid]] = ReportInfo[DOUBLEPLUS[playerid]][repID];
                    strmid(ReportSTR, ReportInfo[DOUBLEPLUS[playerid]][Report], 0, strlen(ReportInfo[DOUBLEPLUS[playerid]][Report]), 40);
                    new stringLengthRep = strlen(ReportSTR); 
                    if(stringLengthRep > 35)
                    {
                        strdel(ReportSTR, 35, stringLengthRep);
                        strins(ReportSTR, "....", 35);
                    }
                    switch(PlayerInfo[playerid][pAdmin])
                    {
                    case 0: // Игрок меню репортов
                        {
                            switch(ReportInfo[DOUBLEPLUS[playerid]][ReportStatus]) 
                            {
                            case 0,1: format(str, sizeof(str), "%i. %s \t%s \t{FFFF00}В очереди...\n", DOUBLEPLUS[playerid], ReportSTR, ReportInfo[DOUBLEPLUS[playerid]][ReportDate]);
                            case 2: format(str, sizeof(str), "%i. %s \t%s \t{FFFF00}Рассмотривается админисратором %s\n", DOUBLEPLUS[playerid], ReportSTR, ReportInfo[DOUBLEPLUS[playerid]][ReportDate], ReportInfo[DOUBLEPLUS[playerid]][AdminReserved]);
                            case 3: format(str, sizeof(str), "%i. %s \t%s \t{9ACD32}Рассмотрено администратором %s\n", DOUBLEPLUS[playerid], ReportSTR, ReportInfo[DOUBLEPLUS[playerid]][ReportDate], ReportInfo[DOUBLEPLUS[playerid]][AdminReserved]);
                            }
                            strcat(GlobalString,str);
                        }
                    default: // Админ меню репортов
                        {
                            format(str, sizeof(str), "%i. %s \t%s \t%s\n", DOUBLEPLUS[playerid], ReportInfo[DOUBLEPLUS[playerid]][Player], ReportSTR, ReportInfo[DOUBLEPLUS[playerid]][ReportDate]);
                            strcat(GlobalString,str);    
                        }
                    }
                } // Конец цикла
                TotalPlayers[playerid] += rows;
                LastPlayers[playerid] = rows;
                if(rows == 10) strcat(GlobalString, "{24c697}Далее...\n");
                if(TotalPlayers[playerid] > 10) strcat(GlobalString, "{afafaf}Назад...");
                switch(PlayerInfo[playerid][pAdmin])
                {
                case 0: ShowPlayerDialog(playerid, 87, DIALOG_STYLE_TABLIST_HEADERS, "Мой список жалоб", GlobalString, "Выбрать", "{FF0000}Отмена");            // Игрок меню жалоб
                default: ShowPlayerDialog(playerid, 84, DIALOG_STYLE_TABLIST_HEADERS, "Список жалоб от игроков", GlobalString, "Выбрать", "{FF0000}Отмена");    // Админ меню жалоб
                }
            }
        case 2: // Показываем ИНФО о репорте
            {
                // Когда админ выбрал какую то жалобу в /rlist, проверям занята она каким то др. админом или нет
                if(strcmp("Нет", ReportInfo[DOUBLEPLUS[playerid]][RepRespondentName]))
                {
                    SCM(playerid, COLOR_GREY, "Администратор %s [ID:%d] уже взялся за эту жалобу", ReportInfo[DOUBLEPLUS[playerid]][RepRespondentName], GetPlayerID(ReportInfo[DOUBLEPLUS[playerid]][RepRespondentName]));
                    cmd_rlist(playerid, "\0");
                    return 1;
                }
                if(!IsPlayerConnected(GetPlayerID(ReportInfo[DOUBLEPLUS[playerid]][Player]))) 
                {
                    SendClientMessage(playerid, COLOR_LIGHTRED, "Такого игрока нет на сервере!");
                    cmd_rlist(playerid, "\0");
                    return 1;
                }
                format(DialogQuery, sizeof(DialogQuery), "UPDATE "T_REPORT" SET Status = '1', RepRespondent = '%s'  WHERE ID = '%d' LIMIT 1", PlayerInfo[playerid][pName], TableLineID[playerid][Result[playerid]]);
                mysql_query(database, DialogQuery);
                format(GlobalString, sizeof(GlobalString), "{ffffff}Отправитель: \t\t\t {33CCFF}%s\
                        \n{ffffff}Дата\t\t\t\t {33CCFF}%s\
                        \n{ffffff}Текст жалобы:\t\t\t {33CCFF}%s",
                ReportInfo[DOUBLEPLUS[playerid]][Player],
                ReportInfo[DOUBLEPLUS[playerid]][ReportDate],
                ReportInfo[DOUBLEPLUS[playerid]][Report]);
                ShowPlayerDialog(playerid, 85, DIALOG_STYLE_MSGBOX, "{FFCC00}Жалоба", GlobalString, "Рассмотреть", "Назад");
                foreach(new i : Player) // Обновляем другим админам список репортов, так как этот репорт теперь занят 
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"ReportListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_rlist(i, "\0");
                }
            }
        case 3: // Берём жалобу на рассмотрение
            {
                TempNumber[playerid] = GetPlayerID(ReportInfo[DOUBLEPLUS[playerid]][Player]);
                if(!IsPlayerConnected(TempNumber[playerid])) 
                {
                    SendClientMessage(playerid, COLOR_LIGHTRED, "Такого игрока нет на сервере!");
                    cmd_rlist(playerid, "\0");
                    return 1;
                }
                SetPVarInt(playerid, "ReportRunned", TableLineID[playerid][Result[playerid]]); // Статус взятого репорта на рассмотрение
                format(DialogQuery, sizeof(DialogQuery), "UPDATE "T_REPORT" SET Status = '2', AdminReserved = '%s' WHERE ID = '%d' LIMIT 1", PlayerInfo[playerid][pName], TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                SCM(playerid, COLOR_YELLOW, "Вы взяли на рассмотрение репорт от игрока %s", ReportInfo[DOUBLEPLUS[playerid]][Player]);
                SCM(TempNumber[playerid], COLOR_YELLOW, "Администратор %s взял на рассмотрение вашу жалобу.", PlayerInfo[playerid][pName]);
                DeletePVar(playerid, "ReportListStatus");
            }
        case 4: // Показываем ИНФО о репорте, который был взят на рассмотрение
            {
                format(GlobalString, sizeof(GlobalString), "{ffffff}Отправитель: \t\t\t {33CCFF}%s\
                                \n{ffffff}Дата\t\t\t\t {33CCFF}%s\
                                \n{ffffff}Текст жалобы:\t\t\t {33CCFF}%s\
                                \n\nЧтобы свернуть это окно нажмите \"ОК\".\
                                \nЕсли вы завершили работу касаемо этой жалобы, нажмите \"Завершить\"",
                ReportInfo[DOUBLEPLUS[playerid]][Player],
                ReportInfo[DOUBLEPLUS[playerid]][ReportDate],
                ReportInfo[DOUBLEPLUS[playerid]][Report]);
                ShowPlayerDialog(playerid, 86, DIALOG_STYLE_MSGBOX, "{FFCC00}Жалоба", GlobalString, "ОК", "Завершить");
            }
        case 5: // Завершаем рассмотрение репорта
            {
                TempNumber[playerid] = GetPlayerID(ReportInfo[DOUBLEPLUS[playerid]][Player]); 
                if(!IsPlayerConnected(TempNumber[playerid]))
                {
                    DeletePVar(playerid, "ReportListStatus");
                    DeletePVar(playerid, "ReportRunned");
                    SendClientMessage(playerid, COLOR_LIGHTRED, "Игрок вышел с сервера!");
                    return 1;
                }
                format(DialogQuery, sizeof(DialogQuery), "UPDATE "T_REPORT" SET Status = '3' WHERE ID = '%d' LIMIT 1", GetPVarInt(playerid,"ReportRunned"));
                mysql_tquery(database, DialogQuery);
                DeletePVar(playerid, "ReportListStatus");
                DeletePVar(playerid, "ReportRunned");
                SCM(TempNumber[playerid], COLOR_YELLOW, "Администратор %s завершил рассмотрение вашей жалобы.", PlayerInfo[playerid][pName]);
                SCM(playerid, COLOR_YELLOW, "Рассмотрение жалобы от игрока %s завершено.", PlayerInfo[TempNumber[playerid]][pName]);
            }
        case 6: // Открываем ИНФО о своем репорте игроку
            {
                format(GlobalString, sizeof(GlobalString), "Отправитель: \t\t\t\t %s\
                    \nДата\t\t\t\t\t %s\
                    \nТекст жалобы:\t\t\t\t %s\
                    \n\n\nОтветственный администратор: %s",
                PlayerInfo[playerid][pName],
                ReportInfo[DOUBLEPLUS[playerid]][ReportDate],
                ReportInfo[DOUBLEPLUS[playerid]][Report],
                ReportInfo[DOUBLEPLUS[playerid]][AdminReserved]);
                switch(ReportInfo[DOUBLEPLUS[playerid]][ReportStatus]) 
                {
                case 0,1: ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FFCC00}Вопрос", GlobalString, "ОК", "");
                case 2: ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FFCC00}Вопрос", GlobalString, "ОК", "");
                case 3: ShowPlayerDialog(playerid, 88, DIALOG_STYLE_MSGBOX, "{FFCC00}Вопрос", GlobalString, "ОК/Удалить", "");
                }
            }
        }
        return 1;
    }
    else SendClientMessage(playerid, COLOR_LIGHTRED, "Лист жалоб пуст!");
    return 1;
}

CMD:anslist(playerid,params[])return cmd_alist(playerid,params);
CMD:alist(playerid,params[])
{
    DOUBLEPLUS[playerid] = 0;
    switch(PlayerInfo[playerid][pAdmin])
    {
    case 0: // Для игрока
        {
            SetPVarInt(playerid, "AnsListStatus",1);
            format(DialogQuery, sizeof(DialogQuery), "SELECT * FROM `"T_VOPROS"` WHERE Player = '%s' LIMIT %i, 10", PlayerInfo[playerid][pName], TotalPlayers[playerid]); // Показываем только вопросы заданные игроком
            mysql_tquery(database, DialogQuery, "@LoadVoprosList", "i", playerid);
        }
    default: // Для админов
        {
            SetPVarInt(playerid, "AnsListStatus",1);
            mysql_format(database, DialogQuery, sizeof(DialogQuery), "SELECT * FROM "T_VOPROS" WHERE Admin = 'None' AND AnsRespondent = 'Нет' LIMIT %i, 10", TotalPlayers[playerid]); // Не пропускаем вопросы уже отвеченные админами и занятые другими админами
            mysql_tquery(database, DialogQuery, "@LoadVoprosList", "i", playerid);
            if(AnsListChanged > 0) // Если требуется обновление списка вопросов так как добавились новые вопросы
            {
                // Обновляем другим админам список вопросов
                AnsListChanged = 0;
                foreach(new i : Player) // Цикл ( личный )
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"AnsListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_alist(i, "\0");
                }
            }
        }
    }
    return true;
}

@LoadVoprosList(playerid, AdmOtvet[]);
@LoadVoprosList(playerid, AdmOtvet[])
{  
    new rows, str[256], VoprosSTR[40];
    cache_get_row_count(rows);
    if(rows)
    {
        cache_get_value_name_int(0, "ID", VoprosInfo[DOUBLEPLUS[playerid]][ansID]);
        cache_get_value_name(0, "AnsRespondent", VoprosInfo[DOUBLEPLUS[playerid]][AnsRespondentName], 24);
        cache_get_value_name(0, "Player", VoprosInfo[DOUBLEPLUS[playerid]][Player], 24);
        cache_get_value_name(0, "Vopros_Date", VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate], 20);
        cache_get_value_name(0, "Vopros", VoprosInfo[DOUBLEPLUS[playerid]][Vopros], 144);
        cache_get_value_name(0, "Admin", VoprosInfo[DOUBLEPLUS[playerid]][Admins], 24);
        cache_get_value_name(0, "Otvet_Date", VoprosInfo[DOUBLEPLUS[playerid]][OtvetData], 20);
        cache_get_value_name(0, "Otvet", VoprosInfo[DOUBLEPLUS[playerid]][Otvet], 144);
        switch(GetPVarInt(playerid,"AnsListStatus"))
        {
        case 1: // Показать список
            {
                DOUBLEPLUS[playerid] = TotalPlayers[playerid];
                GlobalString[0] = EOS;
                switch(PlayerInfo[playerid][pAdmin])
                {
                case 0: format(str, sizeof(str), "Вопрос\tДата\tСтатус\n");
                default: format(str, sizeof(str), "Отправитель\tВопрос\tДата\n");
                }
                strcat(GlobalString,str);
                for(new i = 1; i <= rows; i++)
                {
                    DOUBLEPLUS[playerid]++;
                    cache_get_value_name_int(i-1, "ID", VoprosInfo[DOUBLEPLUS[playerid]][ansID]);
                    cache_get_value_name(i-1, "Player", VoprosInfo[DOUBLEPLUS[playerid]][Player], 24);
                    cache_get_value_name(i-1, "Vopros_Date", VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate], 20);
                    cache_get_value_name(i-1, "Vopros", VoprosInfo[DOUBLEPLUS[playerid]][Vopros], 144);
                    cache_get_value_name(i-1, "Admin", VoprosInfo[DOUBLEPLUS[playerid]][Admins], 24);
                    cache_get_value_name(i-1, "Otvet_Date", VoprosInfo[DOUBLEPLUS[playerid]][OtvetData], 20);
                    cache_get_value_name(i-1, "Otvet", VoprosInfo[DOUBLEPLUS[playerid]][Otvet], 144);
                    TableLineID[playerid][DOUBLEPLUS[playerid]] = VoprosInfo[DOUBLEPLUS[playerid]][ansID];
                    
                    strmid(VoprosSTR, VoprosInfo[DOUBLEPLUS[playerid]][Vopros], 0, strlen(VoprosInfo[DOUBLEPLUS[playerid]][Vopros]), 40);
                    new stringLength = strlen(VoprosSTR); 
                    if(stringLength > 35)
                    {
                        strdel(VoprosSTR, 35, stringLength);
                        strins(VoprosSTR, "....", 35);
                    }
                    switch(PlayerInfo[playerid][pAdmin])
                    {
                    case 0: // Игрок меню вопросов
                        {
                            if(GetString(VoprosInfo[DOUBLEPLUS[playerid]][Admins], "None")) format(str, sizeof(str), "%i. %s \t%s \t{FFFF00}Ожидание ответа\n", DOUBLEPLUS[playerid], VoprosSTR, VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate]);
                            else format(str, sizeof(str), "%i. %s \t%s \t{9ACD32}Ответ получен\n", DOUBLEPLUS[playerid], VoprosSTR, VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate]);
                            strcat(GlobalString,str);    
                        }
                    default: // Админ меню вопросов
                        {
                            format(str, 800, "%i. %s \t%s \t%s\n", DOUBLEPLUS[playerid], VoprosInfo[DOUBLEPLUS[playerid]][Player], VoprosSTR, VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate]);
                            strcat(GlobalString,str);
                        }
                    }
                } // Конец цикла
                TotalPlayers[playerid] += rows;
                LastPlayers[playerid] = rows;
                if(rows == 10) strcat(GlobalString, "{24c697}Далее...\n");
                if(TotalPlayers[playerid] > 10) strcat(GlobalString, "{afafaf}Назад...");
                switch(PlayerInfo[playerid][pAdmin])
                {
                case 0: ShowPlayerDialog(playerid, 82, DIALOG_STYLE_TABLIST_HEADERS, "Мой список вопросов", GlobalString, "Выбрать", "{FF0000}Отмена");              // Игрок меню вопросов
                default: ShowPlayerDialog(playerid, 80, DIALOG_STYLE_TABLIST_HEADERS, "Список вопросов ожидающих ответ", GlobalString, "Выбрать", "{FF0000}Отмена"); // Админ меню вопросов
                }
            }
        case 2: // Показываем админу ИНФО о вопросе
            {
                if(!IsPlayerConnected(GetPlayerID(VoprosInfo[DOUBLEPLUS[playerid]][Player]))) 
                {
                    SendClientMessage(playerid, COLOR_LIGHTRED, "Игрок вышел с сервера!");
                    cmd_alist(playerid, "\0");
                    return 1;
                }
                if(strcmp("Нет", VoprosInfo[DOUBLEPLUS[playerid]][AnsRespondentName]))                
                {
                    SCM(playerid, COLOR_GREY, "Администратор %s[ID:%i] уже взялся за этот вопрос.", VoprosInfo[DOUBLEPLUS[playerid]][AnsRespondentName], GetPlayerID(VoprosInfo[DOUBLEPLUS[playerid]][AnsRespondentName]));
                    cmd_alist(playerid, "\0");
                    return 1;
                }
                format(DialogQuery, sizeof(DialogQuery), "UPDATE `"T_VOPROS"` SET `AnsRespondent` = '%s' WHERE `ID` = '%d'", PlayerInfo[playerid][pName], TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                format(GlobalString, sizeof(GlobalString), "{ffffff}Отправитель: \t\t\t {33CCFF}%s\
                    \n{ffffff}Дата\t\t\t\t {33CCFF}%s\
                    \n{ffffff}Текст вопроса:\t\t\t {33CCFF}%s",
                VoprosInfo[DOUBLEPLUS[playerid]][Player],
                VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate],
                VoprosInfo[DOUBLEPLUS[playerid]][Vopros]);
                ShowPlayerDialog(playerid, 81, DIALOG_STYLE_INPUT, "{FFCC00}Вопрос", GlobalString, "Ответить", "Назад");
                foreach(new i : Player) // Обновляем другим админам список вопросов, так как этот вопрос теперь занят 
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"AnsListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_alist(i, "\0");
                }
            }
        case 3: // Выдача ответа игроку от админа
            {
                TempNumber[playerid] = GetPlayerID(VoprosInfo[DOUBLEPLUS[playerid]][Player]);
                if(!IsPlayerConnected(TempNumber[playerid])) 
                {
                    SendClientMessage(playerid, COLOR_LIGHTRED, "Игрок вышел с сервера!");
                    cmd_alist(playerid, "\0");
                    return 1;
                }
                format(DialogQuery, sizeof(DialogQuery), "UPDATE "T_VOPROS" SET Admin = '%s', Otvet_Date = CURDATE(), Otvet = '%s' WHERE ID = '%d' LIMIT 1", PlayerInfo[playerid][pName], AdmOtvet, TableLineID[playerid][Result[playerid]]);
                mysql_tquery(database, DialogQuery);
                SendClientMessage(TempNumber[playerid], COLOR_YELLOW, "Вы плучили ответ на вопрос. Для просмотра ввесдите /anslist");
                foreach(new i : Player) // Обновляем другим админам список вопросов, так как этот вопрос теперь отвечен 
                {
                    if(i == playerid) return 1;
                    if(GetPVarInt(i,"AnsListStatus") == 1 && PlayerInfo[pAdmin] > 0) cmd_alist(i, "\0");
                }
            }
        case 4: // Показываем игроку ИНФО о вопросе
            {
                format(GlobalString, 400, "Отправитель: \t\t\t\t %s\
                    \nДата\t\t\t\t\t %s\
                    \nТекст вопроса:\t\t\t\t %s\
                    \n\n\nОтвет от администратора\
                    \n\nАдминистратор:\t\t\t %s\
                    \nДата\t\t\t\t\t %s\
                    \nТекст ответа:\t\t\t\t %s",
                VoprosInfo[DOUBLEPLUS[playerid]][Player],
                VoprosInfo[DOUBLEPLUS[playerid]][VoprosDate],
                VoprosInfo[DOUBLEPLUS[playerid]][Vopros],
                VoprosInfo[DOUBLEPLUS[playerid]][Admins],
                VoprosInfo[DOUBLEPLUS[playerid]][OtvetData],
                VoprosInfo[DOUBLEPLUS[playerid]][Otvet]);

                if(strcmp(VoprosInfo[DOUBLEPLUS[playerid]][Admins], "None", true) == 0) return ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "{FFCC00}Вопрос", GlobalString, "ОК", "");
                ShowPlayerDialog(playerid, 83, DIALOG_STYLE_MSGBOX, "{FFCC00}Вопрос", GlobalString, "ОК/Удалить", "");
            }
        }
    }
    else SendClientMessage(playerid, COLOR_LIGHTRED, "Лист вопросов пуст!");
    return 1;
}

stock IsNumeric(const pstring[]) return !sscanf(pstring, "{d}"); // Проверка на числа в диалоге
stock GetPlayerID(pstring[])
{
    foreach(new i : Player)
    {
        if(!IsPlayerConnected(i))continue;
        new testname[MAX_PLAYER_NAME];
        GetPlayerName(i, testname, sizeof(testname));
        if(!strcmp(testname, pstring, true)) return i;
    }
    return INVALID_PLAYER_ID;
}

 

stock GetString(param1[], param2[])
{
    return !strcmp(param1, param2, false);
}
stock SendReportMessage(color, pstring[]) // Отправка сообщений в общий админ чат для репортов
{
    foreach(new i : Player) // Цикл ( личный )
    {
        if(!IsPlayerConnected(i)) return 1;
        if(PlayerInfo[pAdmin] > 0) SendClientMessage(i, color, pstring);
    }
    return 1;
}

 

 

 

Edited by farruhrich

Share this post


Link to post
Share on other sites

Ужас просто... Всё CTRL C + CTRL V, чем вы думаете когда такое выкладываете, на что надеетесь - неизвестно. Что больше всего удивило, так это глобальные массивы, зачем их тут столько? Бог с ним с этими глобальными массивами, раз уж впихнули - так и пользуйтесь, зачем ещё создавать локальные переменные на целых 256 ячеек ??? :( 

Очень много ужаса, в одно сообщение не уместишь. Одним словом кошмар... :foo:

Edited by LoX_1337

Share this post


Link to post
Share on other sites
11 минут назад, LoX_1337 сказал:

Ужас просто... Всё CTRL C + CTRL V, чем вы думаете когда такое выкладываете, на что надеетесь - неизвестно. Что больше всего удивило, так это глобальные массивы, зачем их тут столько? Бог с ним с этими глобальными массивами, раз уж впихнули - так и пользуйтесь, зачем ещё создавать локальные переменные на целых 256 ячеек ??? :( 

Очень много ужаса, в одно сообщение не уместишь. Одним словом кошмар... :foo:

 

Каждый вправе провести оптимизацию и блеснуть своими познаниями, а я просто выложил систему. Откуда интересно "Всё CTRL C + CTRL V" ?)

Share this post


Link to post
Share on other sites

@farruhrich, смысл выкладывать сюда то, что просто скопировано? Просто копируя в тупую - вы не можете объяснить где, что и для чего тот или иной участок кода. У вас уже элементарно фантазии не хватает сделать что-то свое. Куда не посмотри - сплошной копипаст. Куда катится комьюнити.. 

Share this post


Link to post
Share on other sites
18 часов назад, farruhrich сказал:

 

Каждый вправе провести оптимизацию и блеснуть своими познаниями, а я просто выложил систему. Откуда интересно "Всё CTRL C + CTRL V" ?)

Оптимизация ??? O.o Укажите конкретное место где производиться оптимизация. Блеснуть своими знаниями ? O.o Вы хотите скопировать непонятно откуда, чужую систему и под своим именем показать что автор этот системы Вы ? Элементарный пример в моём сообщение сверху, касаемо глобальных массивом и объявление переменных всё за себя говорит. На самом деле очень печально. :/

Share this post


Link to post
Share on other sites

Пожалуй, пора закончить дискуссию насчет данной публикации. Раздел "Готовые решения" на данный момент на то и нужен, чтобы публиковать уже готовые решения (по крайней мере на данный момент). Причем то, откуда взяты те или иные системы, команды, - неважно. Если есть дикое желание пообщаться, милости прошу сюда.

Share this post


Link to post
Share on other sites
2 часа назад, Jawn сказал:

Пожалуй, пора закончить дискуссию насчет данной публикации. Раздел "Готовые решения" на данный момент на то и нужен, чтобы публиковать уже готовые решения (по крайней мере на данный момент). Причем то, откуда взяты те или иные системы, команды, - неважно. Если есть дикое желание пообщаться, милости прошу сюда.

На то и готовые решения, чтобы вставить абсолютно идеальный код в мод без ошибок, а не видеть такое позорище, если конечно у вас тут не форум CTRL C + CTRL V.

Edited by LoX_1337

Share this post


Link to post
Share on other sites
1 час назад, LoX_1337 сказал:

На то и готовые решения, чтобы вставить абсолютно идеальный код в мод без ошибок

Такого почти никогда не бывает, этому способствует еще и структура языка. В котором нет толкового разделения на модули и никаких структур данных кроме глобальных ячеек памяти. 

1 час назад, LoX_1337 сказал:

если конечно у вас тут не форум

Простите не "у вас", а у нас. Форум хоть и создан конкретными людьми, но поддерживается силами каждого участника.

Выше ссылку на обсуждение данной проблемы предоставляли, это и дальнейшее обсуждение этой темы здесь будет рассматриваться как оффтоп. 

Share this post


Link to post
Share on other sites
14 часов назад, LoX_1337 сказал:

На то и готовые решения, чтобы вставить абсолютно идеальный код в мод без ошибок

Такого нет и не будет. Если и есть - то в редких случаях.
Если вставлять в свой код что-либо с форума, то нужно делать системы в виде фильтрскрипта.

Share this post


Link to post
Share on other sites
7 часов назад, glvde. сказал:

Такого нет и не будет. Если и есть - то в редких случаях.
Если вставлять в свой код что-либо с форума, то нужно делать системы в виде фильтрскрипта.

Вот и ответ почему нету, изначально это задумывалась именно так, что люди более опытные предоставляли свои готовые работы/помогали новичкам/делились опытом, а произошло всё по другому, стали появляется такие многоуважаемые люди, которые толком ничего не знают и пытаются что-то сделать. Или вы мне хотите сказать, что форумы сделали наоборот, что неопытные будут делится опытом с неопытными, какой-то бред получается... :( 

Тоже самое про FS, это всё скатилось, люди забыли представление о работах (в данном случае готовые решения), соответственно это и стало не актуально.

Edited by LoX_1337

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • tellarionterceiro
      By tellarionterceiro
      Привет, знает кто может быть как можно создать на карте гангзоны чёрного цвета?

      https://prnt.sc/fSq26C5kj2Xc
    • Bree4t1
      By Bree4t1
      При запуске сервера не определяется даже мод,хотя всё должно быть в порядке
      Вот лог