Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система 'Биндер' (Быстрые сообщения)

faraday.

Эксперт
Регистрация
15 Окт 2015
Сообщения
1,667
Лучшие ответы
77
Репутация
1,008
Награды
1
QuickMessage
Быстрые сообщения 1.0

Система быстрых сообщений (*далее - qm) заменяют программу AHK и Binder, некоторые функции имеют преимущества, к примеру:
- Макросы
- Не используются дополнительные программы.

Описание системы:

Таблица MySQL отдельно от аккаунта игрока, загружается по никнейму.
Версия R40+

Имеется 5 полей для qm, увеличить - не проблема. Меню управление удобное, например можно отправить все сообщения разом, в очередности они появятся в чате.

Есть меню редактирования где можно очистить все qm или изменить каждое по отдельности.

1. Макросы, описание которых есть в инструкции .(на скриншоте) помогают отобразить данные игрока.
Например, я полицейский ЛСПД и хочу забиндить стандартное сообщение, чтобы игрок показал документы:

Добрый день, сотрудник @frac - @nаme. Предъявите пожалуйста ваши документы @pass.

Отобразится:
Добрый день, вас беспокоит сотрудник Los Santos Police - Og_Style. Предъявите пожалуйста ваши документы (( /pass 24 )).
прим.: где /pass там будет автоматически показываться ваш ID (24 как пример), где Los Santos Police может измениться San Fierro Police или FBI, если вдруг игрок перевёлся, qm менять ему не понадобится.
.Так же примеры показаны на скриншоте в инструкции.

2. Можно использовать команды /me /do /try в qm, на видео представлена версия с /do /me, также с макросами.




Шапка мода:

C++:
#define MAX_BIND 5


#define DIALOG_QM         6565
#define DIALOG_EDIT_QM    6566
#define DIALOG_TEXT_QM    6567

enum e_QM_DATA {
    line[128]
}
new quick_mes[MAX_PLAYERS][MAX_BIND][e_QM_DATA];

static const _manual[][] =
{
    "{FFBF00}Quick Message{FFFFFF} - система быстрых сообщений, замена сторонней программы {67E667}QuickBinder{FFFFFF}\n",
    "Для вашего удобства созданны макросы, которые динамически отобразят данные в сообщение.\n\n",
    "{FFBF00}1:  Макросы:\n\n {FFBF00}@name{FFFFFF} - отобразит ваше имя в сообщении\n {FFBF00}@frac{FFFFFF} - отобразит название организации в которой вы состоите\n {FFBF00}@pass{FFFFFF} - отобразит текст команды с вашим ID п.: '(( /pass 24 ))' \n ",//2
    "{FFBF00}@lic{FFFFFF} - отобразит текст команды с вашим ID п.: '(( /lic 24 ))'\n {FFBF00}@alldoc{FFFFFF} - отобразит (( /pass *id* /lic *id* ))\n\n{FFBF00}Примеры сообщений:{FFFFFF}\n\nДобрый день, вас беспокоит сотрудник @frac - @name, предъявите ваши документы @pass.\n\n{FFBF00}Отобразит:{FFFFFF}\n\n",
    "Добрый день, вас беспокоит сотрудник Los Santos Police - Carl Johnson, предъявите ваши документы (( /pass 211 )).\n\n",//3
    "2: Так же, можно использовать команды {FFBF00}/me /do /try\n\n{FFBF00}Примеры сообщений:{FFFFFF}\n\n{FFFFFF}/do в правой руке табель с надписью @frac\n/me показал распальцовку @frac\n\n{FFBF00}Отобразит:{FFFFFF}\n\n{DE92FF}в правой руке табель с надписью Police Los Santos (*Имя*)\n{DE92FF}*имя* показал распольцовку E.S Ballas"//4
};
OnPlayerConnect:

C++:
 new
        query_string[52+MAX_PLAYER_NAME];

    GetPlayerName(playerid, query_string, MAX_PLAYER_NAME);
    format(query_string, sizeof query_string , "SELECT * FROM `quick_message` WHERE `name` = '%s'", query_string);
    mysql_tquery(/*переменная mysql connect*/, query_string, "load_QuickMessage", "i", playerid);

Команда:

C++:
CMD:binder(playerid) {

    new
        format_qm[(128 * 5) + 64];

    format(format_qm, sizeof format_qm,
    "{FFBF00}1. {FFFFFF}%s\n\
    {FFBF00}2. {FFFFFF}%s\n\
    {FFBF00}3. {FFFFFF}%s\n\
    {FFBF00}4. {FFFFFF}%s\n\
    {FFBF00}5. {FFFFFF}%s\n     \n\
    {67E667}Отправить все сообщения\n\
    {FFBF00}Редактировать\n\
    Инструкция",    quick_mes[playerid][0][line],
                    quick_mes[playerid][1][line],
                    quick_mes[playerid][2][line],
                    quick_mes[playerid][3][line],
                    quick_mes[playerid][4][line]);
    return ShowPlayerDialog(playerid, DIALOG_QM, DIALOG_STYLE_LIST, "{37B6CE}Быстрые сообщения:", format_qm, "Выбрать", "Закрыть");
}

Диалоги:
C++:
if( dialogid == DIALOG_QM ) { //case DIALOG_QM:
        if (!response)
            return 1;

        switch( listitem ) {
            case 0..4: {
                new
                    format_str[28];

                format(format_str, sizeof format_str, "Введите текст для поля №%d", listitem+1);

                if(!strcmp(quick_mes[playerid][listitem][line], format_str, true, 64 ))
                    return SendClientMessage(playerid, -1, "Текст для данного сообщения не установлен, для того чтобы задать текст перейдите в раздел {FFBF00}'Редактировать'");
              
                sendQuickMessage(playerid, quick_mes[playerid][listitem][line]);
                cmd_binder(playerid);
            }
            case 6: {
                for( new j; j < 5; j++)
                    sendQuickMessage(playerid, quick_mes[playerid][j][line]);
            }
            case 7:  editMessage(playerid);
            case 8: {
                new string[1156];
                for(new j; j < sizeof _manual; j++) format(string, sizeof string,"%s%s", string, _manual[j]);
                ShowPlayerDialog(playerid, 0000, DIALOG_STYLE_MSGBOX, "{FFBF00}Инструкция:", string,"Ок", "");
            }

        }
        return 1;
    }

    if(dialogid == DIALOG_EDIT_QM) {//case DIALOG_EDIT_QM:
  
        if (!response) return cmd_binder(playerid);
      
        if (listitem != 5) ShowPlayerDialog(playerid, DIALOG_TEXT_QM, DIALOG_STYLE_INPUT, "{FFBF00}Введите сообщение:", " ", "Сохранить", "Назад");
        else {
            for( new j; j < 5; j++ )
                format(quick_mes[playerid][j][line], 28,  "Введите текст для поля №%d", j+1);
            //
            editMessage(playerid);
        }
        SetPVarInt(playerid, #dialog, listitem+1);
    }

    if (dialogid == DIALOG_TEXT_QM) {//case DIALOG_EDIT_QM:
        if (!response)
            return editMessage(playerid);
        if (strlen (inputtext) > 128) {
             SendClientMessage(playerid, -1, "Максимальное количество символов 128");
            return ShowPlayerDialog(playerid, DIALOG_TEXT_QM, DIALOG_STYLE_INPUT, "{37B6CE}Введите сообщение:", " ", "Сохранить", "Назад");
        }

        for( new j; j < 5; j++ ) {
            if(GetPVarInt(playerid, #dialog) == j+1)
                 format(quick_mes[playerid][j][line], 128, inputtext);
        }

        editMessage(playerid);
        save_QuickMessage(playerid);
    }
Вниз мода:


C++:
editMessage(playerid) {

    new format_qm[(128 * 5) + 34];
    format(format_qm, sizeof format_qm, "\
    {FFBF00}1. {FFFFFF}%s\n\
    {FFBF00}2. {FFFFFF}%s\n\
    {FFBF00}3. {FFFFFF}%s\n\
    {FFBF00}4. {FFFFFF}%s\n\
    {FFBF00}5. {FFFFFF}%s\n\
    {67E667}Очистить всё",
                        quick_mes[playerid][0][line],
                        quick_mes[playerid][1][line],
                        quick_mes[playerid][2][line],
                        quick_mes[playerid][3][line],
                        quick_mes[playerid][4][line]);
    ShowPlayerDialog(playerid, DIALOG_EDIT_QM, DIALOG_STYLE_LIST, "{37B6CE}Редактор сообщений:", format_qm, "Выбрать", "Назад");
    return save_QuickMessage(playerid);
}



sendQuickMessage(playerid, string_qm[]) { //Обработчик текста

     if(strfind(string_qm, "Введите текст", true) != -1)
         return 1; //если поле не заполнено, блокируем.

     new
         str[144],
        p_name[ MAX_PLAYER_NAME ];


     strmid(str, string_qm, 0, strlen(string_qm), 255);

    GetPlayerName( playerid, p_name, MAX_PLAYER_NAME );

    if(strfind(str, "@name", true) != -1) {
        new macros = strfind(str, "@name");
        strdel(str, macros, macros + strlen("@name"));
        strins(str, p_name, macros, strlen(str));
    }
    if(strfind(str, "@frac", true)!= -1) {
        new macros = strfind(str, "@frac");
        strdel(str, macros, macros + strlen("@frac"));

        new string[ 24 ];
        format(string, sizeof string, "%s"/*, функция с названием фракции*/);
        strins(str, string, macros, strlen(str));
    }
    if(strfind(str, "@pass", true)!= -1) {
        new macros = strfind(str, "@pass");
        strdel(str, macros, macros + strlen("@pass"));

        new string[16 + 1];
        format(string, sizeof(string), "(( /pass %d ))", playerid);
        strins(str, string, macros, strlen(str));
    }

    if(strfind(str, "@lic", true)!= -1) {
        new macros = strfind(str, "@lic");
        strdel(str, macros, macros + strlen("@lic"));

        new string[15 + 1];
        format(string, sizeof(string), "(( /lic %d ))", playerid);
        strins(str, string, macros, strlen(str));
    }
    if(strfind(str, "@alldoc", true)!= -1) {
        new macros = strfind(str, "@alldoc");
        strdel(str, macros, macros + strlen("@alldoc"));

        new string[25 + 1];
        format(string, sizeof(string), "(( /pass %d /lic %d ))", playerid, playerid);
        strins(str, string, macros, strlen(str));
    }

    if(strfind(str, "/me", true) != -1) {
        new macros = strfind(str, "/me ");
        strdel(str, macros, macros + strlen("/me "));
        return cmd_me(playerid, str);//pc_cmd_me (if pawn.cmd)
    }
    if(strfind(str, "/do", true) != -1) {
        new macros = strfind(str, "/do ");
        strdel(str, macros, macros + strlen("/do "));
        return cmd_do(playerid, str); //pc_cmd_me (if pawn.cmd)
    }
    if(strfind(str, "/try", true) != -1) {
        new macros = strfind(str, "/try ");
        strdel(str, macros, macros + strlen("/try "));
        return cmd_try(playerid, str);//pc_cmd_me (if pawn.cmd)
    }

    format(str, sizeof(str), "%s[%d] говорит: {FCFCFC}%s ",p_name, playerid, str);
    ProxDetector(playerid, 30.0, 0xFFFFFFFF, str);

    str[0] = EOS;
    return 1;
}


forward load_QuickMessage(playerid);
public load_QuickMessage(playerid) {

    new  rows;
    cache_get_row_count(rows);

    if(!rows) {
        new query_string[128];

        GetPlayerName(playerid, query_string, MAX_PLAYER_NAME);

        format(query_string, sizeof query_string , "INSERT INTO `quick_message` (`name`) VALUES ('%s')", query_string);
        mysql_tquery(/*переменная mysql connect*/, query_string, "", "");
    }

    cache_get_value_name(0, "text_1", quick_mes[playerid][0][line], 128);
    cache_get_value_name(0, "text_2", quick_mes[playerid][1][line], 128);
    cache_get_value_name(0, "text_3", quick_mes[playerid][2][line], 128);
    cache_get_value_name(0, "text_4", quick_mes[playerid][3][line], 128);
    cache_get_value_name(0, "text_5", quick_mes[playerid][4][line], 128);

}



save_QuickMessage(playerid) {
    new query_string[128*5 + 24];

    GetPlayerName(playerid, query_string, MAX_PLAYER_NAME);
    format(query_string, sizeof(query_string), "UPDATE `quick_message` SET `text_1` = '%s', `text_2` = '%s', `text_3` = '%s', `text_4` = '%s', `text_5` = '%s' WHERE `name` = '%s'",
        quick_mes[playerid][0][line],
        quick_mes[playerid][1][line],
        quick_mes[playerid][2][line],
        quick_mes[playerid][3][line],
        quick_mes[playerid][4][line],
        query_string);
    return mysql_tquery(/*переменная mysql connect*/, query_string,  "", "");
}
Вместо ProxDetector можете ставить свою функцию (в sendQuickMessage)
что стоит у вас в OnPlayerText для обычного чата (чаще всего это ProxDetector, версия ниже от Ziggi, очередность параметров отличается от RLS`совской)
Код:
stock ProxDetector(playerid, Float:max_range, color, const string[], Float:max_ratio = 1.6)
{
    new
        Float:pos_x,
        Float:pos_y,
        Float:pos_z,
        Float:range,
        Float:range_ratio,
        Float:range_with_ratio,
        clr_r, clr_g, clr_b,
        Float:color_r, Float:color_g, Float:color_b;
 
    if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
        return 0;
    }
 
    color_r = float(color >> 24 & 0xFF);
    color_g = float(color >> 16 & 0xFF);
    color_b = float(color >> 8 & 0xFF);
    range_with_ratio = max_range * max_ratio;
 
#if defined foreach
    foreach (new i : Player) {
#else
    for (new i = GetPlayerPoolSize(); i != -1; i--) {
#endif
        if (!IsPlayerStreamedIn(playerid, i)) {
            continue;
        }
 
        range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
        if (range > max_range) {
            continue;
        }
 
        range_ratio = (range_with_ratio - range) / range_with_ratio;
        clr_r = floatround(range_ratio * color_r);
        clr_g = floatround(range_ratio * color_g);
        clr_b = floatround(range_ratio * color_b);
 
        SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
    }
 
    SendClientMessage(playerid, color, string);
    return 1;
}

Таблица:
C++:
CREATE TABLE IF NOT EXISTS `quick_message` (
`name` varchar(64) NOT NULL,
`text_1` varchar(128) NOT NULL DEFAULT 'Введите текст для поля №1',
`text_2` varchar(128) NOT NULL DEFAULT 'Введите текст для поля №2',
`text_3` varchar(128) NOT NULL DEFAULT 'Введите текст для поля №3',
`text_4` varchar(128) NOT NULL DEFAULT 'Введите текст для поля №4',
`text_5` varchar(128) NOT NULL DEFAULT 'Введите текст для поля №5'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Автор: unreal.
Важно: Если есть другие варианты реализации макросов, с радостью посмотрю :)
 
Последнее редактирование:
Сверху Снизу