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.
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
Código PHP:
vformat(msg, 190, input, 3)
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:
if (!msgSayText) msgSayText = get_user_msgid("SayText");
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:
replace_all(msg, 190, "!g", "^4");
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:
get_players(players, count, "c");
Por desgracia esto está presente en muchos stocks de chatcolor, más adelante explicaré por qué no tendría que estar.
Llegamos a la parte más importante. Esto es el chatcolor, esto envia nuestro mensaje a color, todo lo demás sirve de adorno.
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é.
Código PHP:
message_begin(MSG_ONE, g_msgSayText, _, id)
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).
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.
Código PHP:
write_byte(id)
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.
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).
Código PHP:
write_string(msg)
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.
Nota: La longitud del mensaje no puede exceder los 189 carácteres, o el servidor colapsará.
Código PHP:
message_end()
Luego de haber especificado estos argumentos, enviamos el mensaje con message_end().
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");
new name[32]; get_user_name(id, name, 31); chatcolor(id, "!g[AMXX] !yBienvenido a !teamMi super Server, !g%s", name)
Color verde - !g
Color amarillo - !y
Color de team - !team
Si el index es un ID, el color de !team será el de su equipo. Si el index es 0, el color de !team será blanco.
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.
Stock capaz de mostrar el color deseado de una forma más eficiente (lo hice basándome en este, gracias Destro)
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");
RE: Entendiendo el ChatColor - kirito - 21/07/2014
Puedo usar varios stock verdad perdón por mi pregunta estúpida, ustedes se preguntaran porque.. bueno porque quiero que en el cs se muestren el color blanco,verde,amarillo(default),rojo,azul y en los stock que recién vi solo se ve que el blanco esta en un solo stock.
RE: Entendiendo el ChatColor - alan_el_more - 21/07/2014
El gris aparece cuando usas ^3 y estás de espectador o sin equipo.
O usando el stock donde elegis el color que queres usar independientemente del equipo donde estés.
(21/07/2014, 02:56 PM)kirito escribió: Puedo usar varios stock verdad perdón por mi pregunta estúpida, ustedes se preguntaran porque.. bueno porque quiero que en el cs se muestren el color blanco,verde,amarillo(default),rojo,azul y en los stock que recién vi solo se ve que el blanco esta en un solo stock.
Parece que sólo viste la parte de recopilación de stocks. Si lees la guia completa entenderás qué necesitas. Si no encuentras un stock para tus necesidades, lo puedes hacer
RE: Entendiendo el ChatColor - RauliTop - 28/07/2014
el motivo de por qué no se utiliza MSG_BROADCAST para enviar el mensaje a todos los jugadores y se hace con un loop con MSG_ONE_UNRELIABLE es básicamente porque si alguien intenta poner para mandar color de equipo, siendo broadcast se mandará con color gris (de espectador) en vez de con el color del equipo correcto.
(28/07/2014, 05:33 PM)RauliTop escribió: el motivo de por qué no se utiliza MSG_BROADCAST para enviar el mensaje a todos los jugadores y se hace con un loop con MSG_ONE_UNRELIABLE es básicamente porque si alguien intenta poner para mandar color de equipo, siendo broadcast se mandará con color gris (de espectador) en vez de con el color del equipo correcto.
No RauliTop.
El color dependerá del equipo de quien envía el mensaje (el primer byte del mensaje). Si mandas MSG_BROADCAST y en el byte pones el ID de un terrorista, todos recibirán el mensaje con color Rojo donde corresponde color de team.
EDIT: Si te refieres a que se vea el color del equipo de quien recibe (Algo a lo que no le veo sentido) entonces sería necesario ese bucle.
RE: Entendiendo el ChatColor - RauliTop - 28/07/2014
hace tiempo que hice un test, lo puse así:
write_byte(index? index : 1)
me salía en color gris, supongo porque el jugador no estaba conectado (no había nadie en espectador), que pasaría con 33 o.O
por eso, no tendrá su color de equipo que es lo que precisamente quiere, sino el color del que lo envió
Con cualquier ID fuera de rango en el primer byte obtendrás gris, pero no recomiendo hacer esto (tuve algunos crash haciendo pruebas). Usar 33 es seguro, por eso lo puse en los stocks.
RE: Entendiendo el ChatColor - RauliTop - 29/07/2014
de siempre cuando alguien pone el ^3 en el mensaje a color es para:
si el jugador que lo recibe es T le salga rojo
si es CT le salga azul
y sino gris
con broadcast cuando pongas ^3 en un mensaje con index 0, siempre saldrá el mismo color a todos da igual de que equipo sean
(29/07/2014, 05:51 AM)RauliTop escribió: de siempre cuando alguien pone el ^3 en el mensaje a color es para:
si el jugador que lo recibe es T le salga rojo
si es CT le salga azul
y sino gris
con broadcast cuando pongas ^3 en un mensaje con index 0, siempre saldrá el mismo color a todos da igual de que equipo sean
Algún ejemplo donde eso sea útil? Yo jamás le vi utilidad a eso, y cuando no entendía cómo funcionaba el chatcolor y usaba esos stocks horribles siempre me molestó eso.
Si el byte es 0 no tendrás ningún color, todo va a salir de amarillo. Usa un index de 1 a 33, entre 1 y 32 obtendrás el color del team del jugador (gris si no está conectado). 33 siempre será gris.
RE: Entendiendo el ChatColor - RauliTop - 05/08/2014
bueno, intentando cambiar el loop de jugadores para utilizar broadcast hice esto:
el problema es que ahora cuando pongo un %s o %d o algún parámetro al mensaje, se bugea repitiéndose o no mostrando el valor correcto, esto por ejemplo: