faraday.
Эксперт
QuickMessage
Быстрые сообщения 1.0
Система быстрых сообщений (*далее - qm) заменяют программу AHK и Binder, некоторые функции имеют преимущества, к примеру:Быстрые сообщения 1.0
- Макросы
- Не используются дополнительные программы.
Описание системы:
Таблица MySQL отдельно от аккаунта игрока, загружается по никнейму.
Версия R40+
Имеется 5 полей для qm, увеличить - не проблема. Меню управление удобное, например можно отправить все сообщения разом, в очередности они появятся в чате.
Есть меню редактирования где можно очистить все qm или изменить каждое по отдельности.
1. Макросы, описание которых есть в инструкции .(на скриншоте) помогают отобразить данные игрока.
Например, я полицейский ЛСПД и хочу забиндить стандартное сообщение, чтобы игрок показал документы:
Добрый день, сотрудник @frac - @nаme. Предъявите пожалуйста ваши документы @pass.
Отобразится:
прим.: где /pass там будет автоматически показываться ваш ID (24 как пример), где Los Santos Police может измениться San Fierro Police или FBI, если вдруг игрок перевёлся, qm менять ему не понадобится.Добрый день, вас беспокоит сотрудник Los Santos Police - Og_Style. Предъявите пожалуйста ваши документы (( /pass 24 )).
.Так же примеры показаны на скриншоте в инструкции.
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
};
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, "", "");
}
что стоит у вас в 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.
Важно: Если есть другие варианты реализации макросов, с радостью посмотрю
Последнее редактирование: