farruhrich

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

В теме 10 сообщений

Система репортов и вопросов на диалогах с хранением данных в базе 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;
}

 

 

 

Отредактировано пользователем farruhrich

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Отредактировано пользователем LoX_1337

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
11 минут назад, LoX_1337 сказал:

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
18 часов назад, farruhrich сказал:

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Jawn сказал:

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

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

Отредактировано пользователем LoX_1337

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, LoX_1337 сказал:

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 часов назад, LoX_1337 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, glvde. сказал:

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

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

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

Отредактировано пользователем LoX_1337

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Aleksey98
      От Aleksey98
      Необходим человек: который сможет написать систему тюнинга!
      как на крупных проектах типа: Arizona и Radmir
      И еще требуется Мапперы на новый топовый проект!
      Связь : https://vk.com/id289498732
    • Mister Odin
      От Mister Odin
       
      new
       g_teleport_list[39][E_TELEPORT_LIST] = {  {"Спавн пгт.Батырево", 1802.3612, 2508.4824, 15.8887},  {"Спавн г.Арзамас", -113.5887, 977.7222, 12.0346},     {"Спавн г.Южный", 2744.2770, -2446.7246, 21.8988},     {"Центральный банк", 1852.020385,2040.791381,15.892713},  {"Рублёвка", -837.7783, 888.6161, 12.7232},  {"Казино", 1332.4252, 2358.7014, 17.6641},  {"Битва за контейнеры", 614.5167, 1722.3566, 12.0709},  {"Автосалон низкого класса", 2493.9616, -722.9544, 12.3315},  {"Автосалон среднего класса", 1407.7449, 455.4801, 13.1630},  {"Автосалон высокого класса", -14.0637, 2614.5664, 10.9892},   {"Мотосалон Harley Davidson", 785.720153, 750.465087, 12.000024},  {"Автошкола", 1909.174438,2227.679687,15.708162},  {"Военкомат", 1916.778564,2302.411376,15.574637},  {"Правительство области", -139.140975,593.789611,12.145712},  {"Отдел полиции №1 (ГИБДД)", 1906.805786,-2234.382812,11.257631},  {"Отдел полиции №2 (УМВД)", 2581.309326,-2416.139892,21.960090},  {"Отдел ФСБ", 1823.904663,2095.636718,15.848405},  {"Городская больница г.Арзамас", -285.797210,581.851562,12.120290},   {"СМИ", -317.708038,821.221679,13.051450},  {"Воинская часть", 1703.197265,1678.025878,15.279437},  {"Арзамасская ОПГ", 438.705322,1046.505126,12.002637},  {"Батыревская ОПГ", 1941.203857,2161.006591,15.705187},  {"Лыткаринская ОПГ", -2346.002441,75.257041,21.002962},  {"Шахта", 2381.5727, 1726.4451, -2.1506},  {"Завод", -1062.6697, 2204.1894, 38.0964},  {"Инкосация", 1864.1374, 2011.7136, 15.8546},  {"Транспортная Компания", 2362.1115, 1972.5627, 15.5530},  {"База механиков", 1840.918090,-118.025146,15.695312},  {"Курьерская служба доставки", 2764.509765,-2396.882568,21.890625},  {"Аренда автобуса(Южный)", 2771.041992,-2454.780761,21.845964},  {"Аренда автобуса(Арзамас)", -127.487670,943.652648,12.142824},   {"Аренда автобуса(Батырево)", 1798.986328,2529.591552,15.664262},  {"Гоночная трасса", -1568.7784, 1611.8305, 36.3971},  {"Дом на горе", -789.5397, -456.7479, 741.1422},  {"СТО и тюнинг-ателье", 1856.1375, -122.3266, 15.6888},  {"Аренда транспорта пгт.Батырево", 1763.641723,2255.673339,15.865348},  {"Аренда транспорта г.Арзамас", -36.923530,1360.673583,12.002090},  {"Аренда транспорта г.Южный", 1966.599975,-2603.943603,10.820312},  {"Тайный интерьер в Лыткарино", -2424.5818, 2846.3291, 40.7908} };