[TUT] Tutorial de menues.
#1
Hola, les dejo un tuto de como hacer varios tipos de menu y otras herramientas.
Tienen que tener una base en scripting de pawn.

Creo que esta bastante bien explicado, cualquier duda consulten.


Sistema Nuevo
Código PHP:
#include <amxmodx>

public plugin_init()
{
    
register_plugin("Menu Basico""1.0""[Anti]");
    
register_clcmd"say /menu""cmdMenu" );
}

public 
cmdMenu(id)
{
    new 
gMenu menu_create("\rHola soy un menu""handlerMenu")
    
//creamos el menu en la variable 'Menu' con el titulo 'Hola soy un menu'
    //que segun la opcion que elija el usuario va a llamar a la funcion 'handlerMenu'
    
    
menu_additem(gMenu"\wOpcion #1""1")    //Blanco = \w
    
menu_additem(gMenu"\dOpcion #2""2")    //Transparente = \d
    
menu_additem(gMenu"\yOpcion #3""3")    //Amarillo = \y
                                            //Rojo = \r
    //adderimos opciones al menu 'Menu' y le ponemos el numero de opcion
    
    
menu_display(idgMenu0)
    
//aca le mostramos el menu 'Menu' al 'id'(indice de player) que queramos.
    //el '0' es la pagina del menu que le vamos a mostrar.
}

public 
handlerMenu(idmenuitem)        //los parametros deben ir en este orden
{
    if ( 
item == MENU_EXIT )    //si el item seleccionado es igual a '0'(Exit[Salir])
    
{
        
menu_destroy(menu)        //destruimos el menu
        
return PLUGIN_HANDLED;    //y returnamos la funcion
    
}
    switch(
item)    //hacemos un swicheo de los posibles resultados:
    
{
        case 
0:        //en caso de que precione 1: le mandamos un msj
        
{
            
client_print(idprint_center"HOLA SOY LA OPCION #1.")
        }
        case 
1:        //en caso de que precione 2: le mandamos otro msj
        
{
            
client_print(idprint_center"HOLA SOY LA OPCION #2.")
        }
        case 
2:        //en caso de que precione 3: le mandamos otro msj
        
{
            
client_print(idprint_center"HOLA SOY LA OPCION #3 MUAJAJAJA(?.")
        }
    }
    return 
PLUGIN_HANDLED;    // returnamos la funcion...



Sistema Viejo
Código PHP:
#include <amxmodx>
#include <amxmisc>

new KEYSMENU MENU_KEY_0 MENU_KEY_1 MENU_KEY_2;

public 
plugin_init()
{
    
register_plugin("Menu con Len""1.0""[Anti]");
    
register_clcmd"say /menu""cmdOtroMenu");
    
register_menu("Menu"KEYSMENU"HandMenu");
    
//registramos el menu 'Menu', con las teclas KEYSMENU
    //y el handler que al que va a llamar 'HandMenu'
}

public 
cmdOtroMenu(id)
{
    new 
menu[100], len;
    
// 'menu' es donde se va a alojar el string del menu,
    // en este caso le damos 99 celdas para sus caracteres

    
len 0;
    
    
len += formatex(menu[len], sizeof menu len"\r Menu:^n");
    
len += formatex(menu[len], sizeof menu len"\y[1]\wOpcion #1^n");
    
len += formatex(menu[len], sizeof menu len"\y[2]\wOpcion #2^n^n");
    
len += formatex(menu[len], sizeof menu len"\r[0]\wSalir");
    
    
show_menu(idKEYSMENUmenu, -1"Menu");
    
//mostramos el menu al 'id' deseado, con las teclas ya definidas, el menu 'menu'
    //el timpo es lo que tarda el menu en cerrarse en este caso -1 que es infinito, como lo registre en el init 'Menu')
}

public 
HandMenu(idkeysmenu)        //los parametros deben ir en este orden
{
    switch(
keys)    //hacemos un swicheo de los posibles resultados:
    
{
        case 
0:    client_print(idprint_chat"HOLA SOY LA OPCION #1");        //en caso de que precione 1: le mostramos el menu 'gMenu', en la pagina '0'
        
case 1:    client_print(idprint_center"HOLA SOY LA OPCION #2");    //en caso de que precione 2: le mandamos un msj
        
case 9:    menu_destroy(menu)        //en caso de que precione 0: le destruimos el menu...
    
}



2 Menus 1 Handled
Código PHP:
#include <amxmodx>

public plugin_init()
{
    
register_plugin"2 Menus 1 Handled""1.0""[Anti]" );
    
register_clcmd("say /menu""cmdMenu");
}

public 
cmdMenu(id)
{
    if ( 
get_user_team(id) == )        //Si es del team TT.
        
Menu_TT(id);                    //Mandamos al Menu TT.
    
else if ( get_user_team(id) == )    //Si es del team CT.
        
Menu_CT(id);                    //Mandamos al Menu TT.
}

public 
Menu_TT(id)
{
    new 
menu menu_create("\rMenu TT:""handMenu");
    
    
menu_additem(menu"Opcion 1#""T");
    
menu_additem(menu"Opcion 2#""T");
    
menu_additem(menu"Opcion 3#""T");
    
    
menu_display(idmenu0);            //Mostramos el menu
}

public 
Menu_CT(id)
{
    new 
menu menu_create("\rMenu CT:""handMenu");
    
    
menu_additem(menu"Opcion 1#""C");
    
menu_additem(menu"Opcion 2#""C");
    
menu_additem(menu"Opcion 3#""C");
    
    
menu_display(idmenu0);            //Mostramos el menu
}

public 
handMenu(idmenuitem)
{
    if ( 
item == MENU_EXIT )            //si el item seleccionado es igual a '0'(Exit[Salir])
    
{
        
menu_destroymenu );            //destruimos el menu.
        
return PLUGIN_HANDLED;            //Returnamos la funcion.
    
}
    
    new 
szData[2];
    new 
item_accessitem_callback;
    
menu_item_getinfomenuitemitem_accessszData,charsmaxszData ), __item_callback );
    
//obtenemos informacion del menu y el item elegido.
    
    
switch( szData[0] )        //Vemos la letra que hay en la primera celda de szData
    
{
        case 
'T':            //En este caso si es "T".
        
{
            switch( 
item )    //Switch del Menu TT
            
{
                case 
0:    {}// Opcion 1# TT's
                
case 1:    {}// Opcion 2# TT's
                
case 2:    {}// Opcion 3# TT's
            
}
        }
        case 
'C':            //En este caso si es "C".
        
{
            switch( 
item )    //Switch del Menu CT
            
{
                case 
0:    {}// Opcion 1# CT's
                
case 1:    {}// Opcion 2# CT's
                
case 2:    {}// Opcion 3# CT's
            
}
        }
    }
    
menu_destroy(menu);        //Destruimos el menu
    
return PLUGIN_HANDLED;    //Returnamos el Handled



Diferentes natives(solo para el sistema nuevo)
Código PHP:
//Establece propiedades en un menu. Propiedades:
#define MPROP_PERPAGE        /* Numero de items en cada pagina (default 7)*/
#define MPROP_BACKNAME        /* Nombre del boton "Back" */
#define MPROP_NEXTNAME        /* Nombre del boton "Next" */
#define MPROP_EXITNAME        /* Nombre del boton "Exit" */
#define MPROP_TITLE            /* Establece el titulo de un menu */
#define MPROP_EXIT            /* Establece la funcion del exit con MEXIT_NEVER(no aparece la opcion exit) y MEXIT_ALL(aparece la opcion exit[default]) */
#define MPROP_NOCOLORS        /* Establece si los colores son automaticos */
#define MPROP_NUMBER_COLOR    /* Establece el color de los numeros(default rojo) */

menu_setprop(menuprop, ...);


//Cancela el menu de un player.
menu_cancel(player);

//Adiere una linea de texto al menu.
menu_addtext(menu, const text[], slot=1);

//Adiere un espacio en blanco al menu.
menu_addblank(menuslot=1);

//Destruye el menu.
menu_destroy(menu);

//Establece un texto para un item.
menu_item_setname(menuitem, const name[]);

//Obtiene el indice de item del menu y la pagina indicada(devuelve menor a 0 si es un item especial como MENU_EXIT)
menu_find_id(menupagekey);

//Muestra a una player un menu.
menu_display(idmenupage=0);

//Obtiene la cantidad de items en un menu.
menu_items(menu);

//Obtiene la cantidad de paginas en un menu.
menu_pages(menu); 
Responder
#2
como hago para que cuando ponga la opcion salir, vuelva al menu principal si es que estoy en un submenu
Responder
#3
Vease: if ( item == MENU_EXIT ) le das al menu que quieres returnar y le returneas.



Anti: en cuanto a tu opinion que menu es mejor y porque?



Buen tutorial
Responder
#4
LA BANDA: dependiendo, si es un menu ordinario sin necesidad de incertar una variable preferiria el primer metodo por comodidad, si es necesaeio mostrar un string o numero des preferible el segundo metodo. Mas alla de eso no hay muchas diferencias ni por optimizacion ni nada. Gracia Sonrisa
Responder
#5
Para mi siempre es el mejor el primero, uso formatex y ya y para que no se puedan salir de un menu es algo asi:

menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)

Es algo asi pero deseguro lo escribi mal pruebalo.
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#6
cuando aprietas exit no hace falta mandar menu_destroy, con el return ya te cierra el menú
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#7
(09/11/2013, 02:03 PM)RauliTop escribió: cuando aprietas exit no hace falta mandar menu_destroy, con el return ya te cierra el menú



En realidad si es necesario para liberar memoria

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#8
(09/11/2013, 02:08 PM)alan_el_more escribió:
(09/11/2013, 02:03 PM)RauliTop escribió: cuando aprietas exit no hace falta mandar menu_destroy, con el return ya te cierra el menú

En realidad si es necesario para liberar memoria

Rainbow

es verdad, https://forums.alliedmods.net/showthread.php?t=187159

no sabia, pero si lo vas a utilizar más de 1 vez (como es el caso de la mayoría de los menús) no se debe hacer
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#9
(09/11/2013, 11:35 AM)Metrikcz escribió: Para mi siempre es el mejor el primero, uso formatex y ya y para que no se puedan salir de un menu es algo asi:
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
Es algo asi pero deseguro lo escribi mal pruebalo.

No estoy en la pc ahora pero si, era algo asi, con menu_set_prop podes editar varias cosas del menu.
Ej: el nombre del Exit, los numeros al lado de cada item, el nombre del next y back y algunas cosas mas.
Responder
#10
Lo que hago yo es crear un menu solo una vez con el índice del menu global, así te ahorras el llamado de las natives para crear el menu cada vez que lo queres mostrar

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#11
(09/11/2013, 03:33 PM)alan_el_more escribió: Lo que hago yo es crear un menu solo una vez con el índice del menu global, así te ahorras el llamado de las natives para crear el menu cada vez que lo queres mostrar



Me gusto la idea, lo voy a implementar en mis plugins Sonrisa
Responder
#12
(09/11/2013, 03:54 PM)[Anti] escribió:
(09/11/2013, 03:33 PM)alan_el_more escribió: Lo que hago yo es crear un menu solo una vez con el índice del menu global, así te ahorras el llamado de las natives para crear el menu cada vez que lo queres mostrar



Me gusto la idea, lo voy a implementar en mis plugins Sonrisa

Podrías agregarlo en el tutorial

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#13
(09/11/2013, 04:14 PM)alan_el_more escribió:
(09/11/2013, 03:54 PM)[Anti] escribió:
(09/11/2013, 03:33 PM)alan_el_more escribió: Lo que hago yo es crear un menu solo una vez con el índice del menu global, así te ahorras el llamado de las natives para crear el menu cada vez que lo queres mostrar



Me gusto la idea, lo voy a implementar en mis plugins Sonrisa

Podrías agregarlo en el tutorial



listo, agregado al tuto
Responder
#14
No entendiste mi punto.

Crear el menú solo una vez, en plugin_init por ejemplo



Igualmente lo que te digo es recomendable en menues donde los titulos son constantes

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#15
(09/11/2013, 07:54 PM)alan_el_more escribió: No entendiste mi punto.

Crear el menú solo una vez, en plugin_init por ejemplo



Igualmente lo que te digo es recomendable en menues donde los titulos son constantes



si, entendí pero el punto del tuto es aprender a crear los menúes no llamarlos. Si queres hace un tuto de como llamarlos con ese estilo y lo subo con el mio con tus créditos y todo eso.
Responder
#16
Creas el menu en plugin init lol.
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#17
Osea

Código PHP:
// plugin_init

crear_menu



// Create menu

gmenu menu_crea...



// say /menu

menu_display(idgmenu0

Pero ese menu solo serviria cuando no se le modifique nada o se hagan cosas en el formatos por cosas el del usuario por ejemplo:

if(is_user_alive(id)

menu_add...
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#18
(10/11/2013, 01:48 AM)Metrikcz escribió: Osea

Código PHP:
// plugin_init

crear_menu



// Create menu

gmenu menu_crea...



// say /menu

menu_display(idgmenu0

Pero ese menu solo serviria cuando no se le modifique nada o se hagan cosas en el formatos por cosas el del usuario por ejemplo:

if(is_user_alive(id)

menu_add...



por eso dijo que tenia que ser constante
Responder
#19
Dejo esto para un amigo que me lo pidio D:

Código PHP:
/* Script generated by Pawn Studio */

#include < amxmodx >
#include < amxmisc >

const KEYSMENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9// Sigue abajo D:
// Pocos menues usan todos los "numeros", pero no molestan asi que yo siempre los agrego todos :D 
// P,D: Como muchos se dieorn cuenta no se como explicar esto u.u

public plugin_init( )
{
    
register_clcmd"say /menu""cmdMenu" );
    
    
register_menu"Menu_Reglas"KEYSMENU"MReglas"// Registramos el MENU D:
}
    
public 
cmdMenuid )
{
    new 
gMenugMenu menu_create"\rEl Menu""handlerMenu" );
    
//creamos el menu en la variable 'Menu' con el titulo 'Hola soy un menu'
    //que segun la opcion que elija el usuario va a llamar a la funcion 'handlerMenu'
    
    
menu_additemgMenu"\wServer 1""1" );    //Blanco = \w
    
menu_additemgMenu"\yServer 2""2" );    //Amarillo = \y
    
menu_additemgMenu"\d Reglas""3" );    // Transparente (? = \d
    
    //adderimos opciones al menu 'Menu' y le ponemos el numero de opcion
    
    
menu_displayidgMenu);
    
//aca le mostramos el menu 'Menu' al 'id'(indice de player) que queramos.
    //el '0' es la pagina del menu que le vamos a mostrar.
}

public 
handlerMenuidmenuitem )        //los parametros deben ir en este orden
{
    if( 
item == MENU_EXIT )    //si el item seleccionado es igual a '0'(Exit[Salir])
    
{
        
menu_destroymenu );        //destruimos el menu
        
return PLUGIN_HANDLED;    //y returnamos la funcion
    
}
    
    switch( 
item )    //hacemos un swicheo de los posibles resultados:
    
{
        case 
0engclient_cmdid"connect 397.475.854.744:64087" ); // Hacemos que el cliente execute ese comando ( connect IP )
        
case 1engclient_cmdid"connect 397.475.854.744:64088" ); // Hacemos que el cliente execute ese comando ( connect IP )
        
case 2cmdMenuReglasid ); // Mandamos al cliente al siguiente menu ...
    
}
    
    return 
PLUGIN_HANDLED;    //returnamos la funcion...
}

public 
cmdMenuReglasid )
{
    new 
szMenu100 ], iLen;

    
iLen += formatexszMenuiLen ], charsmaxszMenu ) - iLen"\y Reglas Del servidor ^n^n" ); // Titulo del Menu
    // Recordemos que el sigiente signo: ^n hace que todo lo siguiente en el texto luego de el se muestre abajo del reglon adonde 
    // Estemos escribiendo D:
    
iLen += formatexszMenuiLen ], charsmaxszMenu ) - iLen"Regla numero 1^n" ); // Agregamos item 1 ..
    
iLen += formatexszMenuiLen ], charsmaxszMenu ) - iLen"Regla numero 2 ^n" ); // Agregamos item 2 ..
    
iLen += formatexszMenuiLen ], charsmaxszMenu ) - iLen"Regla numero 3 ^n^n" ); // Agregamos item 3 ..
    
    
iLen += formatexszMenuiLen ], charsmaxszMenu ) - iLen"^n 1- Aceptar^n 2- Rechazar " ); // Agregamos este item donde vamos a mostrarle que
    // presionen 1 para aceptar o 2 para rechazar, recordemos que el ^n nos hace un reglo para abajo todo lo que sigue por lo que tendremos lo siguiente:
    
    /*
        Reglas Del servidor
        
        Regla numero 1
        Regla numero 2
        Regla numero 3
    
        1- Aceptar 
        2- Rechazar
    */
    
    
menu_setpropszMenuiLen ], MPROP_EXITMEXIT_NEVER // Para que no puedan salir del menu ( Si no mal recuerdo era asi ... )
    // Re que esto lo vi en el post de anti jajajajaja, na ni idea como es pero se ve que esta bien (?)
    
    
show_menuidKEYSMENUszMenu_"Menu_Reglas" ); // register_menu( "Menu_Reglas", KEYSMENU, "MReglas")
}

public 
MReglas(id key)
{
    switch( 
key )
    {
        case 
0client_printidprint_chat"Gracias por aceptar las reglas" ); // Si preciono la tecla numero 1 ( Aceptar ) le printeamos el mensaje anterior ..
        
case 1engclient_cmdid"quit" ); //  Si preciona la tecla numero 2 ( Rechazar ) Le cerramos el CS ( Somos re malos )
        
case 2..9cmdMenuReglasid // Hacemos que si preciona otra tecla que no sea 1 ( aceptar ) o 2 ( Rechazar ) Le siga abriendo el menu
    
}
    
    return 
PLUGIN_HANDLED;


Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#20
ese gMenu no es global Whatever
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#21
(14/11/2013, 07:25 PM)RauliTop escribió: ese gMenu no es global Whatever



Nunca use menues nuevos, jamas, que pasa si no es global ?



Saludos,

cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#22
(14/11/2013, 09:36 PM)cLAANS escribió:
(14/11/2013, 07:25 PM)RauliTop escribió: ese gMenu no es global Whatever

Nunca use menues nuevos, jamas, que pasa si no es global ?

Saludos,
cLAANS.-

nada xdd que pusiste gMenu, esa "g" de delante sirve para decir que es global.

pero es mejor hacerla global por si vas a crear más menús, en vez de crear todo el rato un gMenu lo creas solo 1 vez.

lo mismo para szMenu
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#23
(15/11/2013, 10:45 AM)RauliTop escribió:
(14/11/2013, 09:36 PM)cLAANS escribió:
(14/11/2013, 07:25 PM)RauliTop escribió: ese gMenu no es global Whatever



Nunca use menues nuevos, jamas, que pasa si no es global ?



Saludos,

cLAANS.-



nada xdd que pusiste gMenu, esa "g" de delante sirve para decir que es global.



pero es mejor hacerla global por si vas a crear más menús, en vez de crear todo el rato un gMenu lo creas solo 1 vez.



lo mismo para szMenu



Genius



Saludos,

cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#24
(15/11/2013, 10:45 AM)RauliTop escribió:
(14/11/2013, 09:36 PM)cLAANS escribió:
(14/11/2013, 07:25 PM)RauliTop escribió: ese gMenu no es global Whatever



Nunca use menues nuevos, jamas, que pasa si no es global ?



Saludos,

cLAANS.-



nada xdd que pusiste gMenu, esa "g" de delante sirve para decir que es global.



pero es mejor hacerla global por si vas a crear más menús, en vez de crear todo el rato un gMenu lo creas solo 1 vez.



lo mismo para szMenu

Whatdone



are you crazy?
Responder
#25
(15/11/2013, 06:23 PM)[Anti] escribió:
(15/11/2013, 10:45 AM)RauliTop escribió:
(14/11/2013, 09:36 PM)cLAANS escribió:
(14/11/2013, 07:25 PM)RauliTop escribió: ese gMenu no es global Whatever



Nunca use menues nuevos, jamas, que pasa si no es global ?



Saludos,

cLAANS.-



nada xdd que pusiste gMenu, esa "g" de delante sirve para decir que es global.



pero es mejor hacerla global por si vas a crear más menús, en vez de crear todo el rato un gMenu lo creas solo 1 vez.



lo mismo para szMenu

Whatdone



are you crazy?



te ahorras memoria
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)