Agregar nombre de los rangos en mi hook say.
#1
Saludos, tengo este sistema de rangos en mi zp: PD: en vez de poner la variable de nivel puse las de resets para que sean por resets los rangos.
Código PHP:
// Compatible con: ZP Advanced, 4.3, 4.2. 
// Bueno es muy fácil vamos a: 

// Global Variables y agregamos: 

new szRango[][] = { "Recluta""Soldado""Soldado Primero""Cabo""Cabo Primero""Sargento""Sargento Segundo""Sargento Primero""Suboficial""Suboficial Primero""Alférez""Subteniente""Teniente""Teniente Primero""Capitán""Comandante""Teniente Coronel""Coronel""Jefe" // Tenemos 19 rangos
new szNivelRequerido[] = { 01234567891011152021222530333540 // Nivel requerido para el rango depende de cuantos niveles tienen
new iRangos[33]

// Ahora nos vamos al public de donde crearon los niveles y agregamos abajo después del }: 

if(g_iReset >= szNivelRequerido[iRangos[id] + 1]) 

iRangos[id]++ // Aumentamos el Rango 


// Ahora el ultimo paso vamos al hud para mostrarlo: 

// vamos a public ShowHUD(taskid) y agregamos: 

Rango : %szRango[iRangos[id]] 

y lo que quiero es que en este hook say diga el rango del jugador:
Código PHP:
public clcmd_say(id)
{
    static 
said[191// creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
    
read_args(saidcharsmax(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(saidcharsmax(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(said1)) 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s [%d - %d - %s] ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""g_iLevel[id], g_iReset[id], ShowPlayerClass(id/*Fijate*/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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
            
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
            
changeTeamInfo(icolor)
            
// le mandamos el mensaje
            
writeMessage(isaid)
            
// le dejamos el equipo como lo tenía antes
            
changeTeamInfo(iteam)
        }
    }
    
    
// importante para que funcionen otros plugins que hookeen el chat con comandos
    
return PLUGIN_HANDLED_MAIN;
}

ShowPlayerClass(id)
{
    static 
PlayerClass[32];
    
    if (
g_zombie[id])
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_nemesis[id] ? "Nemesis" g_zombie_classname[id/*O la variable que uses para obtener el nombre de la clase*/)
    else
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_survivor[id] ? "- Survivor" "Humano")
        
    return 
PlayerClass;


// 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(saidcharsmax(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(saidcharsmax(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(said1)) 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 playerTeamplayerTeamName[19]
    
playerTeam get_user_team(id)
    
// según el equipo al que pertenezca le ponemos un nombre
    
switch (playerTeam)
    {
        case 
1copy (playerTeamName6"Zombies"// T
        
case 2copy (playerTeamName8"Humanos"// CT
        
default: copy (playerTeamName11"Espectadores"// 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s %s [%d - %d - %s]^x04 %s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""playerTeamNameg_iLevel[id], g_iReset[id], ShowPlayerClass(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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
                
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
                
changeTeamInfo(icolor)
                
// le mandamos el mensaje
                
writeMessage(isaid)
                
// le dejamos el equipo como lo tenía antes
                
changeTeamInfo(iteam)
            }
        }
    }
    
    
// 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(playerteam[])
{
    
// 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_ONEg_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(playermessage[])
{
    
// 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_ONEg_msgSayText, {000}, 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 
lenicount
    len 
strlen(text)
    
count 0
    
    
if (!len)
        return 
false;
    
    for (
0leni++) {
        if (
text[i] != ' ') {
            
count++
            if (
count >= maxcount)
                return 
true;
        }
    }
    
    return 
false;


Intente de varias formas y funcionaba pero los rangos los decía de forma aleatoria, es decir, decía recluta y cuando me mataban y respawneaba decía cadete.
Responder
#2
Código PHP:
public clcmd_say(id)
{
    static 
said[191// creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
    
read_args(saidcharsmax(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(saidcharsmax(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(said1)) 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""g_iLevel[id], g_iReset[id], ShowPlayerClass(id/*Fijate*/szRangoiRangos ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
            
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
            
changeTeamInfo(icolor)
            
// le mandamos el mensaje
            
writeMessage(isaid)
            
// le dejamos el equipo como lo tenía antes
            
changeTeamInfo(iteam)
        }
    }
    
    
// importante para que funcionen otros plugins que hookeen el chat con comandos
    
return PLUGIN_HANDLED_MAIN;
}

ShowPlayerClass(id)
{
    static 
PlayerClass[32];
    
    if (
g_zombie[id])
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_nemesis[id] ? "Nemesis" g_zombie_classname[id/*O la variable que uses para obtener el nombre de la clase*/)
    else
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_survivor[id] ? "- Survivor" "Humano")
        
    return 
PlayerClass;


// 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(saidcharsmax(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(saidcharsmax(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(said1)) 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 playerTeamplayerTeamName[19]
    
playerTeam get_user_team(id)
    
// según el equipo al que pertenezca le ponemos un nombre
    
switch (playerTeam)
    {
        case 
1copy (playerTeamName6"Zombies"// T
        
case 2copy (playerTeamName8"Humanos"// CT
        
default: copy (playerTeamName11"Espectadores"// 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s %s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""playerTeamNameg_iLevel[id], g_iReset[id], ShowPlayerClass(id), szRangoiRangos ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
                
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
                
changeTeamInfo(icolor)
                
// le mandamos el mensaje
                
writeMessage(isaid)
                
// le dejamos el equipo como lo tenía antes
                
changeTeamInfo(iteam)
            }
        }
    }
    
    
// 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(playerteam[])
{
    
// 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_ONEg_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(playermessage[])
{
    
// 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_ONEg_msgSayText, {000}, 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 
lenicount
    len 
strlen(text)
    
count 0
    
    
if (!len)
        return 
false;
    
    for (
0leni++) {
        if (
text[i] != ' ') {
            
count++
            if (
count >= maxcount)
                return 
true;
        }
    }
    
    return 
false;

Responder
#3
Me tira 2 errores.
Código:
//// zombie_plague40.sma
// C:\hlserver\cstrike\addons\amxmodx\scripting\zombie_plague40.sma(3243) : warning 217: loose indentation
// C:\hlserver\cstrike\addons\amxmodx\scripting\zombie_plague40.sma(3245) : warning 217: loose indentation
// C:\hlserver\cstrike\addons\amxmodx\scripting\zombie_plague40.sma(11526) : error 033: array must be indexed (variable "iRangos")
// C:\hlserver\cstrike\addons\amxmodx\scripting\zombie_plague40.sma(11606) : error 033: array must be indexed (variable "iRangos")
//
// 2 Errors.
Responder
#4
Código PHP:
public clcmd_say(id)
{
    static 
said[191// creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
    
read_args(saidcharsmax(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(saidcharsmax(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(said1)) 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""g_iLevel[id], g_iReset[id], ShowPlayerClass(id/*Fijate*/szRangoiRangosid ] ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
            
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
            
changeTeamInfo(icolor)
            
// le mandamos el mensaje
            
writeMessage(isaid)
            
// le dejamos el equipo como lo tenía antes
            
changeTeamInfo(iteam)
        }
    }
    
    
// importante para que funcionen otros plugins que hookeen el chat con comandos
    
return PLUGIN_HANDLED_MAIN;
}

ShowPlayerClass(id)
{
    static 
PlayerClass[32];
    
    if (
g_zombie[id])
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_nemesis[id] ? "Nemesis" g_zombie_classname[id/*O la variable que uses para obtener el nombre de la clase*/)
    else
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_survivor[id] ? "- Survivor" "Humano")
        
    return 
PlayerClass;


// 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(saidcharsmax(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(saidcharsmax(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(said1)) 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 playerTeamplayerTeamName[19]
    
playerTeam get_user_team(id)
    
// según el equipo al que pertenezca le ponemos un nombre
    
switch (playerTeam)
    {
        case 
1copy (playerTeamName6"Zombies"// T
        
case 2copy (playerTeamName8"Humanos"// CT
        
default: copy (playerTeamName11"Espectadores"// 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s %s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""playerTeamNameg_iLevel[id], g_iReset[id], ShowPlayerClass(id), szRangoiRangosid ] ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
                
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
                
changeTeamInfo(icolor)
                
// le mandamos el mensaje
                
writeMessage(isaid)
                
// le dejamos el equipo como lo tenía antes
                
changeTeamInfo(iteam)
            }
        }
    }
    
    
// 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(playerteam[])
{
    
// 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_ONEg_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(playermessage[])
{
    
// 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_ONEg_msgSayText, {000}, 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 
lenicount
    len 
strlen(text)
    
count 0
    
    
if (!len)
        return 
false;
    
    for (
0leni++) {
        if (
text[i] != ' ') {
            
count++
            if (
count >= maxcount)
                return 
true;
        }
    }
    
    return 
false;

Responder
#5
(08/02/2020, 06:21 PM)Chema escribió:
Código PHP:
public clcmd_say(id)
{
    static 
said[191// creamos la variable que servirá para almacenar todo nuestro string relacionado con el chat
    
read_args(saidcharsmax(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(saidcharsmax(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(said1)) 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""g_iLevel[id], g_iReset[id], ShowPlayerClass(id/*Fijate*/szRangoiRangosid ] ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
            
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
            
changeTeamInfo(icolor)
            
// le mandamos el mensaje
            
writeMessage(isaid)
            
// le dejamos el equipo como lo tenía antes
            
changeTeamInfo(iteam)
        }
    }
    
    
// importante para que funcionen otros plugins que hookeen el chat con comandos
    
return PLUGIN_HANDLED_MAIN;
}

ShowPlayerClass(id)
{
    static 
PlayerClass[32];
    
    if (
g_zombie[id])
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_nemesis[id] ? "Nemesis" g_zombie_classname[id/*O la variable que uses para obtener el nombre de la clase*/)
    else
        
formatex(PlayerClasscharsmax(PlayerClass), "%s"g_survivor[id] ? "- Survivor" "Humano")
        
    return 
PlayerClass;


// 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(saidcharsmax(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(saidcharsmax(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(said1)) 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 playerTeamplayerTeamName[19]
    
playerTeam get_user_team(id)
    
// según el equipo al que pertenezca le ponemos un nombre
    
switch (playerTeam)
    {
        case 
1copy (playerTeamName6"Zombies"// T
        
case 2copy (playerTeamName8"Humanos"// CT
        
default: copy (playerTeamName11"Espectadores"// 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(idcolorcharsmax(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(prefixcharsmax(prefix), "%s ^x03%s %s [%d - %d - %s]^4%s ^x04%s"g_isalive[id] ? "^x01" "^x01[DEAD]"is_user_admin(id) ? "[ADMIN]" ""playerTeamNameg_iLevel[id], g_iReset[id], ShowPlayerClass(id), szRangoiRangosid ] ], 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_survivor[id]) format(saidcharsmax(said), "^x03%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(saidcharsmax(said), "%s^x01 :  %s"prefixsaid)
    
    static 
iteam[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 (1<= g_maxplayersi++) // 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(iteamcharsmax(team))
                
// le cambiamos el equipo para que se muestre en el color correcto el ^x03
                
changeTeamInfo(icolor)
                
// le mandamos el mensaje
                
writeMessage(isaid)
                
// le dejamos el equipo como lo tenía antes
                
changeTeamInfo(iteam)
            }
        }
    }
    
    
// 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(playerteam[])
{
    
// 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_ONEg_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(playermessage[])
{
    
// 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_ONEg_msgSayText, {000}, 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 
lenicount
    len 
strlen(text)
    
count 0
    
    
if (!len)
        return 
false;
    
    for (
0leni++) {
        if (
text[i] != ' ') {
            
count++
            if (
count >= maxcount)
                return 
true;
        }
    }
    
    return 
false;


Ahora solo dice Recluta y soy reset 5, debería de decir Cabo Primero.
Responder
#6
La variable iRangos no la estarás aumentando...
Responder
#7
Mira, aquí estan mis publics que chekean los niveles y resets:
Código PHP:
SetExp(indexiExp)
{
    if(!
index || !is_user_connected(index) || g_iLevel[index] >= MAX_LEVEL) return;        

    static 
iLeveliLevel g_iLevel[index];

    
#if defined HAPPYHOUR 
        
g_iExp[index] += (iExp*g_iHappyMulti);
    
#else 
        
g_iExp[index] += iExp;
    
#endif

    
while(g_iExp[index] >= RequiredExp(g_iLevel[index]) && g_iLevel[index] < MAX_LEVEL) ++g_iLevel[index];

    if(
g_iLevel[index] > iLevelzp_colored_print(index"Felicidades! Subiste al nivel ^x04%d ^x01:D"g_iLevel[index]);
    
    if(
g_iReset[index] >= szNivelRequerido[iRangos[index] + 1]) 
    { 
        
iRangos[index]++ // Aumentamos el Rango 
    

}

public 
FuncReset(index)
{
    if(
g_iLevel[index] < MAX_LEVEL)
    {
        
zp_colored_print(index"Necesitas ser nivel ^x04%d ^x01para poder resetear!"MAX_LEVEL);
        return 
PLUGIN_HANDLED;
    }

    ++
g_iReset[index];
    
g_iExp[index] = g_iLevel[index] = 0;

    
zp_colored_print(index"Felicidades! Reseteaste tu cuenta, ahora eres reset ^x04%d"g_iReset[index]);
    return 
PLUGIN_HANDLED;

como ves el public que chekea los niveles esta la variable g_iRangos y la estoy aumentando según el ++.

o será porque cambie los id por indexInsecure
Responder
#8
Código PHP:
SetExp(indexiExp)
{
    if(!
index || !is_user_connected(index) || g_iLevel[index] >= MAX_LEVEL) return;        

    static 
iLeveliLevel g_iLevel[index];

    
#if defined HAPPYHOUR 
        
g_iExp[index] += (iExp*g_iHappyMulti);
    
#else 
        
g_iExp[index] += iExp;
    
#endif

    
while(g_iExp[index] >= RequiredExp(g_iLevel[index]) && g_iLevel[index] < MAX_LEVEL) ++g_iLevel[index];

    if(
g_iLevel[index] > iLevelzp_colored_print(index"Felicidades! Subiste al nivel ^x04%d ^x01:D"g_iLevel[index]);
}

public 
FuncReset(index)
{
    if(
g_iLevel[index] < MAX_LEVEL)
    {
        
zp_colored_print(index"Necesitas ser nivel ^x04%d ^x01para poder resetear!"MAX_LEVEL);
        return 
PLUGIN_HANDLED;
    }

    ++
g_iReset[index];
    
iRangos[index]++
    
g_iExp[index] = g_iLevel[index] = 0;

    
zp_colored_print(index"Felicidades! Reseteaste tu cuenta, ahora eres reset ^x04%d"g_iReset[index]);
    return 
PLUGIN_HANDLED;

Responder
#9
Código:
// C:\hlserver\cstrike\addons\amxmodx\scripting\zombie_plague40.sma(11689) : warning 203: symbol is never used: "szNivelRequerido"

se te olvido esto al favor ponlo que creo que es por eso que todavía me sigue diciendo recluta. y perdón por las molestias amigo
Responder
#10
Si querés todo en bandeja anda a la sección 'Pedidos de plugins'..

Saludos! Crab
Responder
#11
Ps ok mas tarde lo hare.
Responder
#12
Prueba poner esto en alguna parte
Código PHP:
public check_rango(index)
{
    
iRangos[index] = 0;
    while (
g_iReset[index] >= szNivelRequerido[iRangos[index]] && iRangos[index] < szNivelRequerido[sizeof szNivelRequerido-1])
    {
        
iRangos[index] ++;
    }

y remplaza tu funcion de reset por esta
Código PHP:
public FuncReset(index)
{
    if(
g_iLevel[index] < MAX_LEVEL)
    {
        
zp_colored_print(index"Necesitas ser nivel ^x04%d ^x01para poder resetear!"MAX_LEVEL);
        return 
PLUGIN_HANDLED;
    }
    
    
check_rango(index);
    
g_iReset[index]++;
    
g_iExp[index] = g_iLevel[index] = 0;
    
    
zp_colored_print(index"Felicidades! Reseteaste tu cuenta, ahora eres reset ^x04%d"g_iReset[index]);
    return 
PLUGIN_HANDLED;

Tambien te voy a pedir que en el sistema de guardado que estas usando no guardes la variable de rango y al entrar el jugador despues de que le cargue los datos ponle que llame a la funcion "check_rango(index)"
“Quien te quiere en su vida, volverá a buscarte”
Qué frase más estúpida
Porque quien te quiere en su vida, jamás se iría.
Responder
#13
(10/02/2020, 07:59 PM)HK-416 escribió: Prueba poner esto en alguna parte
Código PHP:
public check_rango(index)
{
    
iRangos[index] = 0;
    while (
g_iReset[index] >= szNivelRequerido[iRangos[index]] && iRangos[index] < szNivelRequerido[sizeof szNivelRequerido-1])
    {
        
iRangos[index] ++;
    }

y remplaza tu funcion de reset por esta
Código PHP:
public FuncReset(index)
{
    if(
g_iLevel[index] < MAX_LEVEL)
    {
        
zp_colored_print(index"Necesitas ser nivel ^x04%d ^x01para poder resetear!"MAX_LEVEL);
        return 
PLUGIN_HANDLED;
    }
    
    
check_rango(index);
    
g_iReset[index]++;
    
g_iExp[index] = g_iLevel[index] = 0;
    
    
zp_colored_print(index"Felicidades! Reseteaste tu cuenta, ahora eres reset ^x04%d"g_iReset[index]);
    return 
PLUGIN_HANDLED;

Tambien te voy a pedir que en el sistema de guardado que estas usando no guardes la variable de rango y al entrar el jugador despues de que le cargue los datos ponle que llame a la funcion "check_rango(index)"

Y cómo hago para llamar esa función y perdón amigo por las molestias Confundido
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)