PDA

Просмотр полной версии : [Вопрос] Цвета в чате



Desulaid
31.10.2015, 09:50
Здравствуйте, уважаемые пользователи. У меня такой вопрос, как можно в чате сделать так

{белый цвет}[ЧАТ]{цвет игрока}Untonyst:{белый цвет}бла-бла-бла


public OnPlayerText(playerid, text[])
{
if p_logged{playerid} == 0 *then return 0;
new str[128];
format(str, sizeof(str), "[ЧАТ] {%d}%d: {FFFFFF}%s", GetPlayerColor(playerid), p_name[playerid], text);
SendClientMessageToAll(-1, str);
SetPlayerChatBubble(playerid, text, GetPlayerColor(playerid), 20.0, 10000);
return 0;
}

GetPlayerColor вышел не вариантом, в голове только набросок возможно будущего костыля. Я пока не решаюсь его сделать, по простой причине, может есть другой вариант?


new color_list_array[6][] =
{
"0x00FF00FF",
"0xBFFF00FF",
"0x66FF00FF",
"0x30D5C8FF",
"0xADFF2FFF",
"0xC0C0C0FF"
},
color_list[6] =
{
0x00FF00FF,
0xBFFF00FF,
0x66FF00FF,
0x30D5C8FF,
0xADFF2FFF,
0xC0C0C0FF
}
;

stock get_hex_color(color[11])
{
strdel(color, 0, 2);
strdel(color, 6, 8);
printf("HEX: %s", color);
}

public OnPlayerText(playerid, text[])
{
if p_logged{playerid} == 0 *then return 0;
new str[128];
format(str, sizeof(str), "[ЧАТ] {%s}%d: {FFFFFF}%s", get_hex_color(color_list_array[1]), p_name[playerid], text);
SendClientMessageToAll(-1, str);
SetPlayerChatBubble(playerid, text, GetPlayerColor(playerid), 20.0, 10000);
return 0;
}

// при загрузке аккаунта
SetPlayerColor(playerid, color_list[playerid]);

Daniel_Cortez
31.10.2015, 13:10
Функция GetPlayerColor возвращает цвет в виде числа. Формат - RGBA.
Пример такого числа:

0xFFFFFFFF

В функции SendClientMessage встраиваемые цвета имеют формат RGB.
Пример:

"{FFFFFF}"

Чтобы получить из RGBA представление в формате RGB, нужно сдвинуть число на 8 разрядов вправо, "вытолкнув" A из RGBA.
Едем дальше. В функции format поддерживается спецификатор "%x". Но с этим спецификатором получится число из 8 цифр, а нам нужно всего 6, поэтому лучше указать "%06x".
В итоге получаем следующее:


static const fmt_str[] = "[ЧАТ] {%06x}%s: {FFFFFF}%s";
new string[144];
format(string, sizeof(string), fmt_str, GetPlayerColor(playerid) >> 8, p_name[playerid], text);

Btw, строки (имя игрока в твоём примере) форматируются с помощью спецификатора "%s", а не "%d". Также не лишним будет вспомнить про макс. длину текста в SCM.

$continue$
31.10.2015, 18:03
Функция GetPlayerColor возвращает цвет в виде числа. Формат - RGBA.
Пример такого числа:

0xFFFFFFFF

В функции SendClientMessage встраиваемые цвета имеют формат RGB.
Пример:

"{FFFFFF}"

Чтобы получить из RGBA представление в формате RGB, нужно сдвинуть число на 8 разрядов вправо, "вытолкнув" A из RGBA.
Едем дальше. В функции format поддерживается спецификатор "%x". Но с этим спецификатором получится число из 8 цифр, а нам нужно всего 6, поэтому лучше указать "%06x".
В итоге получаем следующее:


static const fmt_str[] = "[ЧАТ] {%06x}%s: {FFFFFF}%s";
new string[144];
format(string, sizeof(string), fmt_str, GetPlayerColor(playerid) >> 8, p_name[playerid], text);

Btw, строки (имя игрока в твоём примере) форматируются с помощью спецификатора "%s", а не "%d". Также не лишним будет вспомнить про макс. длину текста в SCM.

Предугадываю слова ТС: "Зачем 2 массива?"

Desulaid
31.10.2015, 18:55
Также не лишним будет вспомнить про макс. длину текста в SCM.

Я всегда думал, что 128 ячеек для чатов. Просто на вики (http://wiki.sa-mp.com/wiki/%D0%9B%D0%B8%D0%BC%D0%B8%D1%82%D1%8B_RU) в строке "Ввод и вывод текста (чат и команды)" написано 128 ячеек.


Функция GetPlayerColor возвращает цвет в виде числа. Формат - RGBA.
Пример такого числа:

0xFFFFFFFF

В функции SendClientMessage встраиваемые цвета имеют формат RGB.
Пример:

"{FFFFFF}"

Чтобы получить из RGBA представление в формате RGB, нужно сдвинуть число на 8 разрядов вправо, "вытолкнув" A из RGBA.
Едем дальше. В функции format поддерживается спецификатор "%x". Но с этим спецификатором получится число из 8 цифр, а нам нужно всего 6, поэтому лучше указать "%06x".
В итоге получаем следующее:


static const fmt_str[] = "[ЧАТ] {%06x}%s: {FFFFFF}%s";
new string[144];
format(string, sizeof(string), fmt_str, GetPlayerColor(playerid) >> 8, p_name[playerid], text);



Спасибо, особенно за пример и за "разжевывание" ;)




Предугадываю слова ТС: "Зачем 2 массива?"

Из тебя плохая Ванга ((9(

P.s. нарушение пунктов 4.1 и 16. И чтобы не началось сравнения с оксом, то давай по порядку.
- 1 (4.1), так как тема создается с целью помощи, то кроме советов, встречных вопросов по теме и т.д. здесь явно излишни. Очень понравилась фраза из этого пункта: "Не можете сказать ничего полезного - не говорите."
- 2 (16), вынесение завуалированной агрессии из нашей с тобой беседы (что уж там, спора) на люд, можно расчесть как явное желание продолжить этот спор. И если кто-то (ты :3) хочет копировать стиль кодинга у других (у Стаса) и при этом отчаянно срать на мнение других ("докапатся ..."), не приводя каких-нибудь аргументов в свое оправдание - не хорошо ... Ну не по нраву мне создавать два массива, что с того :cry: Работать же будет аналогично ;)
- * Особенно обидно, когда говорят о тебе, но не с тобой (99((
Просто не делай так больше :to_take_umbrage:

$continue$
31.10.2015, 19:38
Я всегда думал, что 128 ячеек для чатов. Просто на вики (http://wiki.sa-mp.com/wiki/%D0%9B%D0%B8%D0%BC%D0%B8%D1%82%D1%8B_RU) в строке "Ввод и вывод текста (чат и команды)" написано 128 ячеек.

Русский раздел сдох - как и SA-MP (http://wiki.sa-mp.com/wiki/Limits)

Desulaid
31.10.2015, 19:39
Русский раздел сдох - как и SA-MP (http://wiki.sa-mp.com/wiki/Limits)

Никакой разницы "Text I/O (Chat/Commands) 128 cells (512 bytes)"
Add: I/O - это input/output, т.е. "ввод/вывод" )0

$continue$
31.10.2015, 19:44
Поискать, не? Лучше, конечно нести бред.
http://i.imgur.com/KolkLjZ.png

Desulaid
31.10.2015, 19:50
Поискать, не? Лучше, конечно нести бред.
http://i.imgur.com/KolkLjZ.png

:pleasantry:Искать? Пфф, ту ссылку, которую я скинул, я же не искал, я вручную ее набрал ...:pleasantry: :dash2:

L0ndl3m
31.10.2015, 19:57
static const fmt_str[] = "[ЧАТ] {%06x}%s: {FFFFFF}%s";
new string[144];
format(string, sizeof(string), fmt_str, GetPlayerColor(playerid) >> 8, p_name[playerid], text);


Всё-таки правильнее будет ">>>", а не ">>". Или я путаю?

Daniel_Cortez
31.10.2015, 20:32
Всё-таки правильнее будет ">>>", а не ">>". Или я путаю?
Проверил. Да, так будет правильнее, но в данном случае это ни на что не повлияет. Число будет сдвинуто и в вывод попадут 6 младших шестнадцатеричных разрядов числа (RGB), как и было задумано.

Desulaid
01.11.2015, 02:12
Все, кто хотел высказаться высказались, так что тема можно закрывать :)