Allied Modders en español
[TUT] Hookear Say. - Versión para impresión

+- Allied Modders en español (https://amxmodx-es.com)
+-- Foro: AMX Mod X - Scripting (https://amxmodx-es.com/Forum-AMX-Mod-X-Scripting)
+--- Foro: Tutoriales / Guias (https://amxmodx-es.com/Forum-Tutoriales-Guias)
+--- Tema: [TUT] Hookear Say. (/Thread-TUT-Hookear-Say)

Páginas: 1 2


[TUT] Hookear Say. - K.-' - 20/06/2014

Antes de empezar queria decirles que nose si es la forma correcta de hookear , pero a mi me funciono Lengua

Fuente : https://forums.alliedmods.net/showthread.php?t=213368

TUT :

Código PHP:
#include <amxmodx> 
#include <cstrike>

public plugin_init() 

    
register_plugin("Hook Say Basic""0.1""Morte"
    
    
/* Registramos comando say del cliente */ 
    
register_clcmd("say""message_saytext"
    
/* =================================== */ 


new 
g_level[33]

public 
message_saytext(id

    
/* Creamos un array estatico - Este tiene un tamaño de 192 porque seria */ 
    /* el máximo de caracteres que se van a poder escribir */ 
    
static szSay[192
    
/* =================================== */ 
    
    /* Obtenemos lo que escribio el jugador */ 
    
read_args(szSaycharsmax(szSay)) 
    
/* =================================== */ 
    
    /* Removemos las comillas que se forman en el read_args al principio y fin del texto escrito  */ 
    
remove_quotes(szSay
    
/* =================================== */
    
    
replace_all(szSaycharsmax(szSay), "%"" "
    
    
/* Creamos un array estatico para obtener el nombre del jugador */ 
    
static szNombre[32
    
/* =================================== */ 
    
    /* Obtemeos el nombre del jugador */ 
    
get_user_name(idszNombre32
    
    switch(
cs_get_user_team(id))
    {
        case 
CS_TEAM_CT// en el caso de que sea CT
        
{
            if(
is_user_alive(id)) // si esta vivo el CT
            
{
                
ChatColor(0"!t[ CT ][ %s ][ !gLevel %d !t]!y: %s"szNombreg_level[id], szSay// mensaje que es CT , nombre , level , lo que escribio
            
}
            else 
ChatColor(0"!t[ CT ][ MUERTO ][ %s ][ !gLevel %d !t]!y: %s"szNombreg_level[id], szSay// lo mismo pero tambien que esta muerto
        
}     // else : si no esta vivo , mejor dicho caso contrario
        
        
case CS_TEAM_T// si es TT
        
{
            if (
is_user_alive(id)) // si esta vivo el TT
            
{
                
ChatColor(0"!t[ TT ][ %s ][ !gLevel %d !t]!y: %s"szNombreg_level[id], szSay// mensaje que es TT , nombre , level , lo que escribio
            
}
            else 
ChatColor(0"!t[ TT ][MUERTO][ %s ][ !gLevel %d !t]!y: %s"szNombreg_level[id], szSay// lo mismo pero te muestra que estas muerto.
        
// else : si no esta vivo , mejor dicho caso contrario 
        
        
case CS_TEAM_SPECTATOR:
        {
            
ChatColor(0"!t[ Spectator ][ %s ]!y: %s"szNombreszSay)
        }
    } 
    return 
PLUGIN_HANDLED // magia para que no aparesca 2 veces el mensaje
}

// stock de chatcolor
stock ChatColor(const index, const input[], any:...)
{    
    new 
count 1players[32], len
    
static msg[192]
    
    
len formatex(msg,charsmaxmsg ), "");
    
vformat(msg[len], charsmax(msg), input3)
    
msg[191] = '^0';
    
    
replace_all(msg190"!g""^4"// Color Verde
    
replace_all(msg190"!y""^1"// Color Normal
    
replace_all(msg190"!t""^3"// Color de Equipo
    
    
if (indexplayers[0] = index; else get_players(playerscount"ch")
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i])
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
            }
        }
    }


yo cuando lo vi ya entendia :3 espero que entiendan ustedes , nose si
esta explicado bien Lengua espero que lo disfruten n.n Saludos

Imagen :

[Imagen: 10457881_1426424360976618_5036627761350130888_n.jpg]

edit : ustedes tienen que modificar la variable de su nivel , esa es la que yo uso pacman xD Saludos.

lo queria hacer con variables tipo :

new vivo = is_user_alive(id)

pero me tiraba warning


RE: [TUT] Hookear Say. - [R]ak - 20/06/2014

El máximo de caracteres que puede escribir un player es 191 por ende la cantidad maximas de celdas serian 192

Tenes que remplazar si el player escribe "%" por ""

Tenes que chequear que el player escribiera algo y si escribió algo no sean solo espacios


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

arreglado.

en la segunda decis esto :

ChatColor(0, "!t[ TT ][ %s ][ !gLevel %d !t]!y: %s", szNombre, g_level[id], szSay) ?

en la tercera como hago que si escribe espacios directamente no haga nada , recien probe escribiendo espacios y lo mostraba en el say escribiendo nada.


RE: [TUT] Hookear Say. - Pipa Roja - 20/06/2014

no es la mejor forma de hacerlo :3 podrias :
Código PHP:
public cmdSay(id)
{
    static 
Text[192]; read_args(Textcharsmax(Text))
    
remove_quotes(Text)
    
replace_all(Textcharsmax(Text), "%""")

    if(!
ValidMessage(Text) || equal(Text"") || equal(Text" "))
    return 
PLUGIN_HANDLED;
    
    
formatex(Messagecharsmax(Message), "%s^x04%s ^x03%s ^x04[lvl: %d]^x01 : %s"get_user_team(id) == "^x01[Espectador] " : !Alive "^x01[Muerto] " ""g_team[id]/* Podrias poner con enum*/g_playername[id] , g_level[id], Text)

    for( new 
1<= g_maxplayersi++ ) 
    {
        if(!
is_user_connected(i) || is_user_alive(i) != Alive) continue;

        
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _i)
        
write_byte(id)
        
write_string(Message)
        
message_end()
    }
    return 
PLUGIN_HANDLED_MAIN;




RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 07:23 PM)[R]ak escribió: El máximo de caracteres que puede escribir un player es 191 por ende la cantidad maximas de celdas serian 192

Tenes que remplazar si el player escribe "%" por ""

Tenes que chequear que el player escribiera algo y si escribió algo no sean solo espacios

edit : si el player escribe '%' en say se muestra el % ej :

Kira : %

que pasaria ? si lo dejo asi ?


RE: [TUT] Hookear Say. - alan_el_more - 20/06/2014

Estas llamando cs_get_user_team tres veces innecesariamente cuando podes llamarlo una vez de la siguiente forma:

Código PHP:
new iPlayerTeam cs_get_user_team(id)
    
switch(
iPlayerTeam)
{
    case 
CS_TEAM_CT//
    
case CS_TEAM_T//
    
case CS_TEAM_SPECTATOR//


Fuente: https://wiki.alliedmods.net/Optimizing_Plugins_(AMX_Mod_X_Scripting)


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 07:31 PM)Pipa Roja escribió: no es la mejor forma de hacerlo :3 podrias :
Código PHP:
public cmdSay(id)
{
    static 
Text[192]; read_args(Textcharsmax(Text))
    
remove_quotes(Text)
    
replace_all(Textcharsmax(Text), "%""")

    if(!
ValidMessage(Text) || equal(Text"") || equal(Text" "))
    return 
PLUGIN_HANDLED;
    
    
formatex(Messagecharsmax(Message), "%s^x04%s ^x03%s ^x04[lvl: %d]^x01 : %s"get_user_team(id) == "^x01[Espectador] " : !Alive "^x01[Muerto] " ""g_team[id]/* Podrias poner con enum*/g_playername[id] , g_level[id], Text)

    for( new 
1<= g_maxplayersi++ ) 
    {
        if(!
is_user_connected(i) || is_user_alive(i) != Alive) continue;

        
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _i)
        
write_byte(id)
        
write_string(Message)
        
message_end()
    }
    return 
PLUGIN_HANDLED_MAIN;


esa puede ser la mejor forma pero me quedo con la mia que la entiendo mas Lengua creo que el tut que postee es mas facil que la que tu posteaste
pero la tuya obiamente esta mas optimizada. Saludos Gran sonrisa :3 y gracias
por dar tu opinion n.n

(20/06/2014, 07:33 PM)alan_el_more escribió: Estas llamando cs_get_user_team tres veces innecesariamente cuando podes llamarlo una vez de la siguiente forma:

Código PHP:
new iPlayerTeam cs_get_user_team(id)
    
switch(
iPlayerTeam)
{
    case 
CS_TEAM_CT//
    
case CS_TEAM_T//
    
case CS_TEAM_SPECTATOR//


Fuente: https://wiki.alliedmods.net/Optimizing_Plugins_(AMX_Mod_X_Scripting)

n.n Whatever hay corrijo :3

edit : si esta vivo o muerto como le hago ?


RE: [TUT] Hookear Say. - alan_el_more - 20/06/2014

(20/06/2014, 07:31 PM)Pipa Roja escribió: no es la mejor forma de hacerlo :3 podrias :
Código PHP:
public cmdSay(id)
{
    static 
Text[192]; read_args(Textcharsmax(Text))
    
remove_quotes(Text)
    
replace_all(Textcharsmax(Text), "%""")

    if(!
ValidMessage(Text) || equal(Text"") || equal(Text" "))
    return 
PLUGIN_HANDLED;
    
    
formatex(Messagecharsmax(Message), "%s^x04%s ^x03%s ^x04[lvl: %d]^x01 : %s"get_user_team(id) == "^x01[Espectador] " : !Alive "^x01[Muerto] " ""g_team[id]/* Podrias poner con enum*/g_playername[id] , g_level[id], Text)

    for( new 
1<= g_maxplayersi++ ) 
    {
        if(!
is_user_connected(i) || is_user_alive(i) != Alive) continue;

        
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _i)
        
write_byte(id)
        
write_string(Message)
        
message_end()
    }
    return 
PLUGIN_HANDLED_MAIN;


No

Código PHP:
new iAlive
iAlive 
is_user_alive(id)

if(
iAlive)
//
else
// 



RE: [TUT] Hookear Say. - Pipa Roja - 20/06/2014

/* Registramos comando say del cliente */
register_clcmd("say", "message_saytext")
/* =================================== */


te falto
register_clcmd("say_team", "message_saytext")


c&p esto es lo mismo que publico LuKks solo cambiaste las variables y editaste los textos y pusiste get_user_team ademas de que lo ayas puesto de la peor forma( la llamas mucho)


RE: [TUT] Hookear Say. - [R]ak - 20/06/2014

(20/06/2014, 07:36 PM)alan_el_more escribió:
(20/06/2014, 07:31 PM)Pipa Roja escribió: no es la mejor forma de hacerlo :3 podrias :
Código PHP:
public cmdSay(id)
{
    static 
Text[192]; read_args(Textcharsmax(Text))
    
remove_quotes(Text)
    
replace_all(Textcharsmax(Text), "%""")

    if(!
ValidMessage(Text) || equal(Text"") || equal(Text" "))
    return 
PLUGIN_HANDLED;
    
    
formatex(Messagecharsmax(Message), "%s^x04%s ^x03%s ^x04[lvl: %d]^x01 : %s"get_user_team(id) == "^x01[Espectador] " : !Alive "^x01[Muerto] " ""g_team[id]/* Podrias poner con enum*/g_playername[id] , g_level[id], Text)

    for( new 
1<= g_maxplayersi++ ) 
    {
        if(!
is_user_connected(i) || is_user_alive(i) != Alive) continue;

        
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _i)
        
write_byte(id)
        
write_string(Message)
        
message_end()
    }
    return 
PLUGIN_HANDLED_MAIN;


No

Código PHP:
new iAlive
iAlive 
is_user_alive(id)

if(
iAlive)
//
else
// 

me lo copio casi todo de algun plugin mio por q yo lo arme asi;

Código PHP:
public cmdSay(id)
{
    static 
Text[192]
    
read_args(Textcharsmax(Text))
    
remove_quotes(Text)
    
    
replace_all(Textcharsmax(Text), "%""")
    
    if(!
ValidMessage(Text))
        return 
PLUGIN_HANDLED
    
    
static Name[32], AliveMessage[192]
    
get_user_name(idNamecharsmax(Name))
    
    
Alive is_user_alive(id)
    
    
formatex(Messagecharsmax(Message), "^x04%s %s^x03%s^x01 : %s"g_AdminTag[id], get_user_team(id) == SPECT "^x01*SPEC* " : !Alive "^x01*DEAD* " ""NameText)
    
    for( new 
1<= g_MaxPlayersi++ ) {
        if(!
is_user_connected(i) || is_user_alive(i) != Alive)
            continue;
        
        
message_begin(MSG_ONE_UNRELIABLEg_MsgSayText_i)
        
write_byte(id)
        
write_string(Message)
        
message_end()
    }
    
    return 
PLUGIN_HANDLED;
}

ValidMessage(text[]) {
    static 
leni
    len 
strlen(text)
    
    if(!
len)
        return 
false
    
    
for(0leni++) {
        if( 
text[i] != ' ' ) {
            return 
true
        
}
    }

    return 
false


ese es de mi plugin TagSay


RE: [TUT] Hookear Say. - Pipa Roja - 20/06/2014

? enserio ? lol ami me lo paso el 3mcy-daimon-t perdón Rak no sabia que era tullo


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 07:39 PM)Pipa Roja escribió: /* Registramos comando say del cliente */
register_clcmd("say", "message_saytext")
/* =================================== */


te falto
register_clcmd("say_team", "message_saytext")


c&p esto es lo mismo que publico LuKks solo cambiaste las variables y editaste los textos y pusiste get_user_team ademas de que lo ayas puesto de la peor forma( la llamas mucho)

no es que me falto , no lo quise hacer Whatever


RE: [TUT] Hookear Say. - [R]ak - 20/06/2014

La cantidad maxima de caracteres que puede tener un nombre es 31 osea 32 celdas;

Entiendo q a muchos le resulte facil poner el numero de celdas que tiene un array -1; pero aver; usen charsmax(array); por que después tienen q aumentar/disminuir el tamaño de un array y tienen q cambiarlo en todas las funciones que pusieron su numero a mano; sean prolijos al programar


RE: [TUT] Hookear Say. - mongito100 - 20/06/2014

seria conveniente q aregles todo lo que te dicen...
usa un PLUGIN_HANDLED_MAIN en ves de PLUGIN_HANDLED

Sigo sin entender por q la gente trata de hacer tutoriales cuando no esta capacitada


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 08:28 PM)mongito100 escribió: seria conveniente q aregles todo lo que te dicen...
usa un PLUGIN_HANDLED_MAIN en ves de PLUGIN_HANDLED

Sigo sin entender por q la gente trata de hacer tutoriales cuando no esta capacitada

intento arreglar las cosas , pero tanto no entiendo , ya arregle algunas cosas . estoy viendo lo otro.


RE: [TUT] Hookear Say. - [R]ak - 20/06/2014

(20/06/2014, 08:28 PM)mongito100 escribió: seria conveniente q aregles todo lo que te dicen...
usa un PLUGIN_HANDLED_MAIN en ves de PLUGIN_HANDLED

Sigo sin entender por q la gente trata de hacer tutoriales cuando no esta capacitada

ya lo dije en otro post; EXPLICA por que cambiar el tipo de return


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 08:42 PM)[R]ak escribió:
(20/06/2014, 08:28 PM)mongito100 escribió: seria conveniente q aregles todo lo que te dicen...
usa un PLUGIN_HANDLED_MAIN en ves de PLUGIN_HANDLED

Sigo sin entender por q la gente trata de hacer tutoriales cuando no esta capacitada

ya lo dije en otro post; EXPLICA por que cambiar el tipo de return

lo cambio por que mongito me dice , o obiamente mongito sabe mas que yo :b y tambien corrijo los errores que puedo correjir pero no le veo la diferencia , al final que return dejo ?

cual post ? O.o ?

edit : el de CSAxel de las habilidades ?


RE: [TUT] Hookear Say. - [R]ak - 20/06/2014

Código:
#define PLUGIN_CONTINUE        0    /* Results returned by public functions */
#define PLUGIN_HANDLED        1    /* stop other plugins */
#define PLUGIN_HANDLED_MAIN    2    /* to use in client_command(), continue all plugins but stop the command */

yo se la diferencia; pero veo muchas veces q dicen cambia X return por X y no explican por que y asi terminan mareando a los q no saben

edit: y si; lo habia dicho en el post de CSAxel


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 08:50 PM)[R]ak escribió:
Código:
#define PLUGIN_CONTINUE        0    /* Results returned by public functions */
#define PLUGIN_HANDLED        1    /* stop other plugins */
#define PLUGIN_HANDLED_MAIN    2    /* to use in client_command(), continue all plugins but stop the command */

yo se la diferencia; pero veo muchas veces q dicen cambia X return por X y no explican por que y asi terminan mareando a los q no saben

edit: y si; lo habia dicho en el post de CSAxel

ok haora lo arreglo :3


RE: [TUT] Hookear Say. - mongito100 - 20/06/2014

Cita:/* to use in client_command(), continue all plugins but stop the command */
tan simple como q si registro el say de /verduras en otro plugin si lo toma; si pusiera plugin_handle no lo tomaria salvo q estuviera en la lista de plugins antes


RE: [TUT] Hookear Say. - Mía - 20/06/2014

Código PHP:
replace_all(szSaycharsmax(szSay), "%"" "
Es importante. Si no lo usas algun cliente te podría tumbar el servidor fácilmente...


RE: [TUT] Hookear Say. - K.-' - 20/06/2014

(20/06/2014, 11:50 PM)Mario AR. escribió:
Código PHP:
replace_all(szSaycharsmax(szSay), "%"" "
Es impotante. Si no lo usas algun cliente te podría tumbar el servidor fácilmente...

Genius arreglado xD


RE: [TUT] Hookear Say. - cLAANS - 21/06/2014

Puedo poner espacios y saldría mi nombre solo.
Puedo escribir en verde, azul y rojo.

Podrías poner una opción para lo siguiente:
Con la forma que estas hookeando el say si yo estoy vivo y alguien esta muerto nos podremos leer entre los 2 osea totalmente diferente a como es el chat del cs default

¡ Buen aporte !

Saludos,
cLAANS.-


RE: [TUT] Hookear Say. - K.-' - 21/06/2014

(21/06/2014, 03:41 AM)cLAANS escribió: Puedo poner espacios y saldría mi nombre solo.
Puedo escribir en verde, azul y rojo.

Podrías poner una opción para lo siguiente:
Con la forma que estas hookeando el say si yo estoy vivo y alguien esta muerto nos podremos leer entre los 2 osea totalmente diferente a como es el chat del cs default

¡ Buen aporte !

Saludos,
cLAANS.-

es sarcasmo o es lo que yo pienso Genius parecio eso pacman


RE: [TUT] Hookear Say. - cLAANS - 21/06/2014

(21/06/2014, 03:53 AM)K.- escribió:
(21/06/2014, 03:41 AM)cLAANS escribió: Puedo poner espacios y saldría mi nombre solo.
Puedo escribir en verde, azul y rojo.

Podrías poner una opción para lo siguiente:
Con la forma que estas hookeando el say si yo estoy vivo y alguien esta muerto nos podremos leer entre los 2 osea totalmente diferente a como es el chat del cs default

¡ Buen aporte !

Saludos,
cLAANS.-

es sarcasmo o es lo que yo pienso Genius parecio eso pacman

No, no es sarcasmo

Saludos,
cLAANS.-