En este tutorial explicaré cada parte del ChatColor con detalles, pues he visto que muchos quieren usarlo sin tener la menor idea de cómo funciona. El principal objetivo no es que quienes lean este tutorial entiendan a la perfección el chatcolor, pero sí que sepan usarlo adecuadamente y dejen de utilizar esos stocks tan horrorosos de chatcolor que andan sueltos por ahí.
Al final del tutorial dejaré una recopilación de diferentes stocks Chatcolor "óptimos", para diferentes usos.
Al final del tutorial dejaré una recopilación de diferentes stocks Chatcolor "óptimos", para diferentes usos.
- ¿Qué hay en un stock de chatcolor?
- Veamos un clásico stock chatcolor mal hecho:
Código PHP:stock chatcolor(id, const input[], any:...)
{
static count, players[32], msg[191], msgSayText;
vformat(msg, 190, input, 3)
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!team", "^3")
if (id)
{
players[0] = id;
count = 1;
}
else
get_players(players, count, "c");
for (new i = 0; i < count; i++)
{
message_begin(MSG_ONE_UNRELIABLE, msgSayText, _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
Las partes del stock
- Esta native nos sirve para dar formato a un texto segun una referencia (La referencia es el any:...). Indicamos el string donde obtendremos el texto con el formato, la longitud máxima, el string del texto que se va a formatear y el número del argumento de referencia (la posición del any:...).Código PHP:
vformat(msg, 190, input, 3)
- Aquí se obtiene el ID de los mensajes SayText. Se hace así porque el ID de los mensajes no va a cambiar en medio del juego, no es necesario llamar a la native cada vez que necesitemos este ID, con una vez es suficiente.Código PHP:
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
- Esto es algo totalmente inútil a mi parecer, pero muchos lo usan. Simplemente reemplaza todos los '!g' por '^4'. Los mensajes que enviamos por SayText se pueden mostrar en color segun estos carácteres: ^1 (cvar con_color, por defecto amarillo), ^3 (color del team de quien envia el mensaje) y ^4 (color verde).Código PHP:
replace_all(msg, 190, "!g", "^4");
- Por desgracia esto está presente en muchos stocks de chatcolor, más adelante explicaré por qué no tendría que estar.Código PHP:
get_players(players, count, "c");
- Llegamos a la parte más importante. Esto es el chatcolor, esto envia nuestro mensaje a color, todo lo demás sirve de adorno.Código PHP:
message_begin(MSG_ONE_UNRELIABLE, msgSayText, _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
- Veamos un clásico stock chatcolor mal hecho:
- Ahora que conocemos el "verdadero" chatcolor, veamos cómo funciona.
- Primero, voy a darles una noción básica de los mensajes en HL. Los mensajes son el "lenguaje de comunicación" entre el servidor de HL y los clientes. Lo que hacemos en el stock de chatcolor es enviar un mensaje "SayText". Hay muchos tipos de mensajes que usa HL, conozco 2 que nos pueden imprimir mensajes en el chat, pero "SayText" es el que nos va a permitir mostrar color.
- Este mensaje tiene 2 argumentos: el "remitente" y el "mensaje". (Sí, como una carta!). El remitente es el índice de un jugador (entre 1 y 32, si usamos 0 el mensaje no tendrá color) (byte) y el mensaje, pues el texto a mostrar ^^ (string).
- Regresando al tema de los mensajes de HL, los mensajes se pueden enviar a destinos predefinidos por HL. Los principales son: MSG_ONE, MSG_ALL y sus contrapartes en el unreliable channel: MSG_ONE_UNRELIABLE y MSG_BROADCAST. También está MSG_SPEC y otros 4 que no entiendo ni explicaré.
- Cuando llamamos a la native message_begin(), le indicamos el destino de nuestro mensaje. Recomiendo usar MSG_ONE_UNRELIABLE y MSG_BROADCAST, ya que la diferencia con sus contrapartes es que estos mensajes se pueden perder en el camino sin generar "daños", mientras si los otros mensajes se pierden (por loss, desconexión) generalmente hacen que el servidor colesione (CRASH).Código PHP:
message_begin(MSG_ONE, g_msgSayText, _, id)
- Si ponemos MSG_ONE_UNRELIABLE, tenemos que indicarle un ID de un jugador a quien se va a dirigir el mensaje. Con MSG_BROADCAST, el mensaje va a TODOS O.O, sí, a todos! Por eso no se debería de usar get_players en el stock de chatcolor si con MSG_BROADCAST ya enviamos el mensaje a todos. También podemos usar MSG_SPEC, que enviará el mensaje a los clientes HLTV.
- message_begin() también nos permite establecer el origen del mensaje, aunque esto no es necesario en absoluto para enviar mensajes de chat.
- Vamos otra vez con "SayText". El primer argumento en este mensaje es un byte, que es el ID del jugador que envia el mensaje. El color depende del equipo de este jugador. El id puede ser un jugador no conectado, no tendremos problemas con ello, en este caso el color será el del equipo del último jugador que tuvo ese número de ID.Código PHP:
write_byte(id)
DATO (Gracias Destro por la información): Podemos "hacer creer" a los jugadores que el jugador (o entidad) con ID 33, 34, 35, etc pertenece a un equipo, así al utilizar estos IDs en este byte del mensaje obtendremos los colores deseados. (Más info en los stocks).
- El segundo argumento es el mensaje, con nuestros códigos de color. El código de color ^3 hace que nuestro mensaje tenga el color del equipo del jugador que envia el mensaje (vease write_byte arriba). Si el jugador no está conectado o está de espectador, nos mostrará gris; si es CT, nos mostrará Azul y si es TT, nos mostrará Rojo.Código PHP:
write_string(msg)
Nota: La longitud del mensaje no puede exceder los 189 carácteres, o el servidor colapsará.
- Luego de haber especificado estos argumentos, enviamos el mensaje con message_end().Código PHP:
message_end()
- Primero, voy a darles una noción básica de los mensajes en HL. Los mensajes son el "lenguaje de comunicación" entre el servidor de HL y los clientes. Lo que hacemos en el stock de chatcolor es enviar un mensaje "SayText". Hay muchos tipos de mensajes que usa HL, conozco 2 que nos pueden imprimir mensajes en el chat, pero "SayText" es el que nos va a permitir mostrar color.
- Recopilación de Chatcolor
- Chatcolor simple para mostrar un mensaje a todos los jugadores, sin formato.
Código PHP:stock chatcolor_all(input[])
{
static msgSayText;
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
if (strlen(input) >= 190)
input[190] = '^0';
message_begin(MSG_BROADCAST, msgSayText);
write_byte(33);
write_string(input);
message_end();
}
Modo de uso:
- Chatcolor con formato, para un jugador o para todos.
Código PHP:stock chatcolor(id, const input[], any:...)
{
static szMsg[191], msgSayText;
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
vformat(szMsg, 190, input, 3);
replace_all(szMsg, 190, "!g", "^4");
replace_all(szMsg, 190, "!y", "^1");
replace_all(szMsg, 190, "!team", "^3");
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgSayText, .player = id);
write_byte(id ? id : 33);
write_string(szMsg);
message_end();
}
Modo de uso:
- Un "chatcolor" más avanzado y elegante (Printf), permite elegir el color (Hecho por [R]ak - Sacado de aquí). Sólo envia un mensaje a un jugador, no index 0.
Código PHP:enum {
DEFAULT,
RED,
BLUE,
GRAY,
GREEN
}
stock printf(id, color, const msg[], any:...) {
static Buffer[192], MsgSayText, MsgTeamInfo, Team[11]
if(!MsgSayText) {
MsgTeamInfo = get_user_msgid("TeamInfo")
MsgSayText = get_user_msgid("SayText")
}
vformat(Buffer[1], charsmax(Buffer) - 1, msg, 4)
static const g_Teams[4][11] = {
"UNASSIGNED",
"TERRORIST",
"CT",
"SPECTATOR"
}
if(color) {
if(color == GREEN) {
Buffer[0] = 0x04
message_begin(MSG_ONE_UNRELIABLE, MsgSayText, _, id)
write_byte(id)
write_string(Buffer)
message_end()
}
else {
Buffer[0] = 0x03
get_user_team(id, Team, charsmax(Team))
message_begin(MSG_ONE_UNRELIABLE, MsgTeamInfo, _, id)
write_byte(id)
write_string(g_Teams[color])
message_end()
message_begin(MSG_ONE_UNRELIABLE, MsgSayText, _, id)
write_byte(id)
write_string(Buffer)
message_end()
message_begin(MSG_ONE_UNRELIABLE, MsgTeamInfo, _, id)
write_byte(id)
write_string(Team)
message_end()
}
}
else {
Buffer[0] = 0x01
message_begin(MSG_ONE_UNRELIABLE, MsgSayText, _, id)
write_byte(id)
write_string(Buffer)
message_end()
}
}
Modo de uso: - El printf del Panda editado para soportar index 0 (Para todos).
Código PHP:enum {
DEFAULT,
RED,
BLUE,
GRAY,
GREEN
}
stock printf(id, color, const msg[], any:...) {
static Buffer[192], MsgSayText, MsgTeamInfo, Team[32]
if(!MsgSayText) {
MsgTeamInfo = get_user_msgid("TeamInfo")
MsgSayText = get_user_msgid("SayText")
}
vformat(Buffer[1], charsmax(Buffer) - 1, msg, 4)
static const Teams[2][10] = {
"TERRORIST",
"CT"
}
switch (color) {
case DEFAULT: {
Buffer[0] = 0x01
printf_do(id, id ? id : 33, Buffer, MsgSayText)
}
case GREEN: {
Buffer[0] = 0x04
printf_do(id, id ? id : 33, Buffer, MsgSayText)
}
case GRAY: {
Buffer[0] = 0x03
printf_do(id, 33, Buffer, MsgSayText)
}
case RED, BLUE: {
Buffer[0] = 0x03
if (id) {
if (get_user_team(id, Team, charsmax(Team)) == color) {
printf_do(id, id, Buffer, MsgSayText)
}
else {
printf_do(id, id, Teams[color-1], MsgTeamInfo)
printf_do(id, id, Buffer, MsgSayText)
printf_do(id, id, Team, MsgTeamInfo)
}
}
else {
static Num;
get_players(Team, Num, "e", Teams[color-1]);
if (Num) {
printf_do(id, Team[0], Buffer, MsgSayText)
}
else {
get_players(Team, Num, "h");
if (!Num) {
return;
}
Num = Team[0];
get_user_team(Num, Team, charsmax(Team));
printf_do(Num, Num, Teams[color-1], MsgTeamInfo)
printf_do(id, Num, Buffer, MsgSayText)
printf_do(Num, Num, Team, MsgTeamInfo)
}
}
}
}
}
printf_do(id, sender, const data[], MsgID) {
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, MsgID, _, id)
write_byte(sender)
write_string(data)
message_end()
}
Modo de uso: Igual que el anterior.
- Stock capaz de mostrar el color deseado de una forma más eficiente (lo hice basándome en este, gracias Destro)
Modo de uso:Código PHP:// Va al inicio
enum Colors
{
Gris = 33,
Rojo,
Azul
}
// Si ya tienes client_putinserver, solo agregas la linea
public client_putinserver(id)
{
set_task(0.2, "chatcolor_send_teaminfo", id);
}
// Al final o donde quieras
stock chatcolor(id, Colors:color, msg[], any:...)
{
static szMsg[191], msgSayText;
#define teaminfo_sent(%0) (TeamInfoSent & (1<<%0))
if (!msgSayText)
msgSayText = get_user_msgid("SayText");
vformat(szMsg, 190, msg, 4);
replace_all(szMsg, 190, "!g", "^4");
replace_all(szMsg, 190, "!y", "^1");
replace_all(szMsg, 190, "!color", "^3");
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgSayText, .player = id);
write_byte(color ? (_:color) : 33);
write_string(szMsg);
message_end();
}
public chatcolor_send_teaminfo(id)
{
if (!is_user_connected(id))
return;
static msgTeamInfo;
if (!msgTeamInfo)
msgTeamInfo = get_user_msgid("TeamInfo");
static const pTeams[][] = { "", "TERRORIST", "CT" };
for (new pid = 0; pid < 3; pid++)
{
message_begin(MSG_ONE_UNRELIABLE, msgTeamInfo, .player = id)
write_byte(pid+33)
write_string(pTeams[pid])
message_end()
}
}
- Chatcolor simple para mostrar un mensaje a todos los jugadores, sin formato.