Bueno, en realidad no es que tuviera ganas de hacer esto pero viendo los tutoriales que hay por ahí... no ví ninguno de estos y los que ví están mal hechos. Por eso mismo me he propuesto hacer yo uno propio.
Sinceramente no sé si existe una forma mejor, simplemente yo utilizo esta y os la voy a enseñar. Es simple, es la forma que utiliza el admin chat colors.
Seguramente muchas veces habréis intentado hookear el say pero luego había incompatibilidad de plugins que hookean el say cada uno para su cosa y etc.
Pues aquí os enseño como crear el vuestro propio.
Para el chat recuerden:
En fin, seguramente haya algo mal explicado o alguna cosa que me haya faltado, solo digan y se edita fácil
Saludos!
Sinceramente no sé si existe una forma mejor, simplemente yo utilizo esta y os la voy a enseñar. Es simple, es la forma que utiliza el admin chat colors.
Seguramente muchas veces habréis intentado hookear el say pero luego había incompatibilidad de plugins que hookean el say cada uno para su cosa y etc.
Pues aquí os enseño como crear el vuestro propio.
Código PHP:
// forward llamada cuando carga el plugin e inicia mapa (1 vez por mapa)
public plugin_init()
{
// registramos los comandos que utiliza el cliente para mandar los mensajes que saldrán en el chat
register_clcmd("say", "clcmd_say")
register_clcmd("say_team", "clcmd_team_say")
}
// nuestro chat general se hace aquí
public clcmd_say(id)
{
static said[191] // creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
read_args(said, charsmax(said)) // obtenemos lo que escribimos (ej: say "hola soy yo") ahí obtenemos "hola soy yo"
remove_quotes(said) // le quitamos las comillas al string
replace_all(said, charsmax(said), "%", " ") // reemplazamos el % en caso de que alguien lo escriba para evitarnos el famoso bug
// comprobamos que el mensaje sea válido, si no lo es para la función
if (!ValidMessage(said, 1)) return PLUGIN_CONTINUE;
// variable para almacenar el equipo (la utilizamos después) y otro string para añadir prefijos etc. a lo que dijimos
static color[11], prefix[91]
get_user_team(id, color, charsmax(color))
// hacemos uso de nuestro string anterior
// la primera variable servirá para saber si está vivo el jugador, si no tienen ninguna creada pues utilicen is_user_alive
// la segunda variable es un ejemplo, por si quieren añadir más cosas, yo le puse el ejemplo de (VIP)
// tercera variable seguro que la utilizan, la mayoría de los que quieren hacer esto con el chat es para mostrar el nivel de la persona que habla, ni falta decir que g_level es otro ejemplo
// cuarta variable será el nombre del jugador, si no la tienen cacheada en una variable, pues tendrán que crear una aquí y utilizar get_user_name
formatex(prefix, charsmax(prefix), "%s%s[Nivel:^x04 %d^x01]^x03 %s", g_isalive[id] ? "^x01" : "^x01*MUERTO* ", g_vip[id] ? "(VIP) " : "", g_level[id], g_playername[id])
// formatex es más rápido, pero aquí conviene utilizar format para no tener que crear 1 variable de más
// ahora chequeamos que si es admin/VIP (como ejemplo) le ponga lo que dice en verde
if (is_user_admin(id) || g_vip[id]) format(said, charsmax(said), "^x04%s", said)
// le añadimos el prefijo a lo que dijo para tenerlo todo en 1 solo string en vez de 2 por separado
format(said, charsmax(said), "%s^x01 : %s", prefix, said)
static i, team[11] // variables que utilizaremos para el loop de jugadores, con team obtenemos su equipo porque hará falta cambiarlo para enviar el mensaje con el color correcto de equipo
for (i = 1; i <= g_maxplayers; i++) // g_maxplayers es otro ejemplo de variable, su valor es get_maxplayers() cacheado en plugin_init
{
// otra variable cacheada, si no la tienen utilicen is_user_connected
// si no está conectado el jugador del loop, paramos y seguimos con otro
if (!g_isconnected[i]) continue;
// pueden leer el mensaje que se escribió si:
// es admin el jugador que lo recibirá
// el que lo envió y el que lo recibirá están los dos vivos
// el que lo envió y el que lo recibirá están los dos muertos
// la variable g_isalive ya la expliqué anteriormente
if (is_user_admin(i) || g_isalive[id] && g_isalive[i] || !g_isalive[id] && !g_isalive[i])
{
// obtenemos el equipo del que va a recibir el mensaje
get_user_team(i, team, charsmax(team))
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
changeTeamInfo(i, color)
// le mandamos el mensaje
writeMessage(i, said)
// le dejamos el equipo como lo tenía antes
changeTeamInfo(i, team)
}
}
// importante para que funcionen otros plugins que hookeen el chat con comandos
return PLUGIN_HANDLED_MAIN;
}
// nuestro chat de equipo se hace aquí
public clcmd_team_say(id)
{
static said[191] // creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
read_args(said, charsmax(said)) // obtenemos lo que escribimos (ej: say "hola soy yo") ahí obtenemos "hola soy yo"
remove_quotes(said) // le quitamos las comillas al string
replace_all(said, charsmax(said), "%", " ") // reemplazamos el % en caso de que alguien lo escriba para evitarnos el famoso bug
// comprobamos que el mensaje sea válido, si no lo es para la función
if (!ValidMessage(said, 1)) return PLUGIN_CONTINUE;
// variable para almacenar el equipo (la utilizamos después) y otra variable en la cual le pondremos el nombre de equipo
static playerTeam, playerTeamName[19]
playerTeam = get_user_team(id)
// según el equipo al que pertenezca le ponemos un nombre
switch (playerTeam)
{
case 1: copy (playerTeamName, 6, "Holas") // T
case 2: copy (playerTeamName, 8, "Adioses") // CT
default: copy (playerTeamName, 11, "Espectador") // distinto de 1 y 2
}
// variable para almacenar el equipo (la utilizamos después) y otro string para añadir prefijos etc. a lo que dijimos
static color[11], prefix[111]
get_user_team(id, color, charsmax(color))
// hacemos uso de nuestro string anterior
// la primera variable servirá para saber si está vivo el jugador, si no tienen ninguna creada pues utilicen is_user_alive
// la segunda variable es el equipo que pusimos antes
// tercera variable seguro que la utilizan, la mayoría de los que quieren hacer esto con el chat es para mostrar el nivel de la persona que habla, ni falta decir que g_level es otro ejemplo
// cuarta variable será el nombre del jugador, si no la tienen cacheada en una variable, pues tendrán que crear una aquí y utilizar get_user_name
formatex(prefix, charsmax(prefix), "%s-%s- [Nivel:^x04 %d^x01]^x03 %s", g_isalive[id] ? "^x01" : "^x01*MUERTO* ", playerTeamName, g_level[id], g_playername[id])
// formatex es más rápido, pero aquí conviene utilizar format para no tener que crear 1 variable de más
// ahora chequeamos que si es admin/VIP (como ejemplo) le ponga lo que dice en verde
if (is_user_admin(id) || g_vip[id]) format(said, charsmax(said), "^x04%s", said)
// le añadimos el prefijo a lo que dijo para tenerlo todo en 1 solo string en vez de 2 por separado
format(said, charsmax(said), "%s^x01 : %s", prefix, said)
static i, team[11] // variables que utilizaremos para el loop de jugadores, con team obtenemos su equipo porque hará falta cambiarlo para enviar el mensaje con el color correcto de equipo
for (i = 1; i <= g_maxplayers; i++) // g_maxplayers es otro ejemplo de variable, su valor es get_maxplayers() cacheado en plugin_init
{
// otra variable cacheada, si no la tienen utilicen is_user_connected
// si no está conectado el jugador del loop, paramos y seguimos con otro
if (!g_isconnected[i]) continue;
// es del mismo equipo, seguiremos chequeando a ver...
if (get_user_team(i) == playerTeam)
{
// si el que envió el mensaje está vivo y él también, lo podrá leer
// si el que envió el mensaje está muerto y él también, lo podrá leer
if (g_isalive[id] && g_isalive[i] || !g_isalive[id] && !g_isalive[i])
{
// obtenemos el equipo del que va a recibir el mensaje
get_user_team(i, team, charsmax(team))
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
changeTeamInfo(i, color)
// le mandamos el mensaje
writeMessage(i, said)
// le dejamos el equipo como lo tenía antes
changeTeamInfo(i, team)
}
}
}
// importante para que funcionen otros plugins que hookeen el chat con comandos
return PLUGIN_HANDLED_MAIN;
}
// esta función lo que hace es cambiar el equipo
// player es el index del jugador
// team es el equipo al que cambiará
public changeTeamInfo(player, team[])
{
// importante que sea MSG_ONE, para asegurarnos de que se envía
// g_msgTeamInfo es una variable chacheada en plugin_init cuyo valor es get_user_msgid("TeamInfo")
message_begin(MSG_ONE, g_msgTeamInfo, _, player)
write_byte(player)
write_string(team)
message_end()
}
// esta función enviará el mensaje por chat
// player es el index del jugador
// message será el mensaje (string) que se enviará
public writeMessage(player, message[])
{
// importante que sea MSG_ONE, para asegurarnos de que se envía
// g_msgSayText es una variable chacheada en plugin_init cuyo valor es get_user_msgid("SayText")
message_begin(MSG_ONE, g_msgSayText, {0, 0, 0}, player)
write_byte(player)
write_string(message)
message_end()
}
// Stock -counts number of characters in a string-
// es un stock que encontré por ahí y lo modifiqué un poco
stock ValidMessage(text[], maxcount) {
static len, i, count
len = strlen(text)
count = 0
if (!len)
return false;
for (i = 0; i < len; i++) {
if (text[i] != ' ') {
count++
if (count >= maxcount)
return true;
}
}
return false;
}
Para el chat recuerden:
Código:
^x01 -> color naranja o amarillo... según como lo vean (color default del chat)
^x04 -> color verde, aquí no soy daltónico
^x03 -> color del equipo
En fin, seguramente haya algo mal explicado o alguna cosa que me haya faltado, solo digan y se edita fácil
Saludos!