Raised This Month: $51 Target: $400
 12% 

[GUIA] Crear Menu desde archivo *.ini.


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
SicknessArG
Junior Member
Join Date: Oct 2012
Location: Paraná, Entre Ríos (ARG)
Old 10-06-2012 , 11:04   [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #1

Bueno, resulta que hace unos años yo no tenia ni idea de como crear un menú desde un ini.
A que me refiero con esto? A que los items del menú sean leídos a través de un archivo *.ini.

Aclaro que el tutorial es pobre y seguramente ya existe algún tutorial en ingles (No encontré en español), pero tal vez a alguno le sirva como ami me hubiera servido hace unos años.

ACLARACIÓN!! Antes de irme puteando con que la guía esta hecha así nomas y etc, quiero aclararles que soy malísimo explicando, pero me esfuerzo para mejorarlo...Si alguno tiene una crítica constructiva o una sugerencia bien detallada le agradecería que lo postee.
De nuevo aclaro, no soy bueno explicando, solo se lo que hay que hacer.

Procedo...
Code:
#include <amxmodx> #include <amxmisc> new gFileName[] = "menu.ini";   //Definimos el nombre de nuestro archivo. #define MAXITEMS    10    //Definimos la cantidad de items que tendrá nuestro menú. #define ITEMSLEN    32   //Definimos la cantidad de caracteres que podrá poseer el nombre de cada item del menu. /* Items */ new gItems[MAXITEMS+1][ITEMSLEN+1]//Aquí guardaremos los items de nuestro menú. public plugin_init() {     /* Plugin Registration */     register_plugin("[GUIA] Menu by *.ini file", "0.0.1", "SicknessArG");         /* Command */     register_clcmd("say /menu", "cmdMenu"); } public cmdMenu(id) {     new menu = menu_create("\yMenu\w", "cmdMenuHandler");   //Creamos el menú.         new Path[256]//Creamos esta variable para luego usarla para obtener la ruta de la carpeta configs.     get_configsdir(Path, charsmax(Path));   //Que RÁPIDO! ... Obtenemos la ruta a la carpeta configs.     formatex(Path, charsmax(Path),"%s/%s", Path, gFileName);    //Declaramos que Path ahora es la ruta a nuestro archivo.         if(!file_exists(Path))  //Chequeamos si nuestro archivo existe.     {         client_print(id, print_chat, "[AMXX] El archivo %s no existe", gFileName);         return PLUGIN_HANDLED;  //Sino, paramos ahí y no hacemos mas nada y seguís leyendo al pedo.     }         new f = fopen(Path, "rt")//Si existe, leemos el texto del archivo (r = read) (t = text).         new iName[ITEMSLEN+1]//Creamos una variable para el nombre de cada item del menu.     new Item;   //Creamos una variable para el numero de cada item.         while(!feof(f)) //Mientras que nuestro archivo este abierto...     {         fgets(f, iName, charsmax(iName));   //Obtenemos el nombre de cada item y lo guardamos dentro de la variable iName.         if(!iName[0] || iName[0] == ';'   //(No necesario, pero sirve), esto es para que si en el archivo un texto comienza con         || iName[0] == '/' && iName[1] == '/' ) continue;   // ; o // no sea leído y por lo tanto no aparezca en nuestro menú.                 copy(gItems[Item], charsmax(gItems), iName);    //Copiamos cada item dentro de la variable gItems.         Item++;      //Aumentamos la cantidad de items, cuyo valor es igual a la cantidad puesta en el archivo ini                             //pero menor o igual a la cantidad definida en MAXITEMS.                                             if(Item >= MAXITEMS) break;   //Porque si la cantidad de items supera a MAXITEMS se rompe el loop y no continua nuestro plugin.                 menu_additem(menu, iName, gItems[Item]);        //Pero sino, adherimos cada item en el menú.     }     fclose(f)//Cerramos nuestro archivo.         menu_display(id, menu)//Mostramos el menú.     return PLUGIN_HANDLED; } public cmdMenuHandler(id, menu, item) {     if(item == MENU_EXIT)     {         menu_destroy(menu);         return PLUGIN_HANDLED;     }         new iData[6];     new iName[ITEMSLEN+1];     new Access;     new Callback;     menu_item_getinfo(menu, item, Access, iData, charsmax(iData), iName, charsmax(iName), Callback);     client_print(id, print_chat, "Haz elegido %s", iName)//Y al elegir un item se mostrará el nombre en el chat.             menu_destroy(menu);  //Cerramos el menú.     return PLUGIN_HANDLED;  //FIN. }

Lo único que nos queda hacer es crear el archivo y ponerlo en <amxdir>/configs.

Ejemplo :
Code:
; Archivo INI de la guía re polenta de Fedde :p (?

Pato
Ganzo
Gato
Caballo
Morsa
Tuhermana
Rata
Perro
Yadijecaballo?
Velociraptor
Testeado y funcionando perfectamente.

Last edited by SicknessArG; 10-07-2012 at 00:29.
SicknessArG is offline
Send a message via MSN to SicknessArG Send a message via Skype™ to SicknessArG
Roccoxx
AlliedModders Donor
Join Date: Jan 2012
Location: Argentina
Old 10-06-2012 , 11:35   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #2

buenisimo, ya me acostumbre al menu viejo, y en algunos casos a usar el nuevo. pero creo ue esto servira a varios usuarios.

OFF:pasa face fede
__________________
Tutorials here (Spanish)

Like as another Pijudo said: "Tired and retired"
Roccoxx is offline
Send a message via MSN to Roccoxx
lucas_7_94
Leche Loco
Join Date: Mar 2009
Location: Argentina
Old 10-06-2012 , 12:10   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #3

No es una muy buena idea abrir un archivo cada vez que se abra un menú. y al parecer no va a depender de ninguna condición que tenga el cliente , asi que lo podes hacer dinámico al menú.

Saludos.
__________________
ATWWMH - MiniDuels
Madness is like gravity, just need a little push.
lucas_7_94 is offline
Send a message via Skype™ to lucas_7_94
SicknessArG
Junior Member
Join Date: Oct 2012
Location: Paraná, Entre Ríos (ARG)
Old 10-06-2012 , 21:14   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #4

Quote:
Originally Posted by lucas_7_94 View Post
No es una muy buena idea abrir un archivo cada vez que se abra un menú. y al parecer no va a depender de ninguna condición que tenga el cliente , asi que lo podes hacer dinámico al menú.

Saludos.
Tenes razón. Luego lo optimizo.
SicknessArG is offline
Send a message via MSN to SicknessArG Send a message via Skype™ to SicknessArG
r0ma
Senior Member
Join Date: Apr 2012
Location: Great Tomb of Nazarick
Old 10-06-2012 , 23:30   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #5

Sickness el code no te compila si no agregas
PHP Code:
#include <amxmisc> 
Yo lo haria asi:
PHP Code:
#include <amxmodx>
#include <amxmisc>

//Gracias a [R]ak por mostrarme como leer archivos .ini

new g_MainMenu

public plugin_init()
{
    
register_plugin"Menu desde .ini""1.0""r0ma'" );
    
    
register_clcmd"say /menu""clcmd_menu" );
}

public 
plugin_cfg( )
{
    new 
Archivo64 ], buffer64 ], num], i;
    
    
get_configsdirArchivocharsmaxArchivo ) );
    
    
formatArchivocharsmaxArchivo ), "%s/mi_menu.ini"Archivo );
    
    if( !
file_existsArchivo ) )
        
create_fileArchivo );
    
    new 
File fopenArchivo"rt" );
    
    
g_MainMenu menu_create"\yMenu.ini""menuini_handler" );
    
    while( !
feofFile ) )
    {
        
fgetsFilebuffercharsmaxbuffer ) );
        
        
trimbuffer );
        
        if( !
buffer] || buffer] == ';' )
            continue;
        
        
        
remove_quotesbuffer );
        
        
i++
        
        
num] = i;

        
menu_additemg_MainMenubuffernum );
    }
    
    
fcloseFile );
    
    
menu_setpropg_MainMenuMPROP_EXITNAME"Salir!" );
    
menu_setpropg_MainMenuMPROP_BACKNAME"Anterior!" );
    
menu_setpropg_MainMenuMPROP_NEXTNAME"Siguiente!" );
    
}

public 
menuini_handleridmenuitem )
{
    if( 
item == MENU_EXIT )
        return;
    
    
    new 
iData], iName64 ], iAccessiCallback;
    
    
menu_item_getinfomenuitemiAccessiDatacharsmaxiData ), iNamecharsmaxiName ), iCallback );
    
    new 
key iData];
    
    
client_printidprint_chat"Has elejido la opcion: %d. %s"keyiName );
}

public 
clcmd_menuid )
{    
    
menu_displayidg_MainMenu );
    
    return 
PLUGIN_HANDLED;
}

create_fileArchivo[] )
{
    new 
File fopenArchivo"wt" );
    
    
fprintfFile"; Ejemplo de Menu desde .ini^n; ^"Opcion 1^"^n;^"Opcion 2^"^n;^"Opcion 3^"^n; Gracias a [R]ak por mostrarme como leer archivos .ini " );
    
    
fcloseFile );


EDIT:

Para crear multiples menu:
PHP Code:
#include <amxmodx>
#include <amxmisc>

#define MAX_MENU    10

new menu[MAX_MENU]

public 
plugin_init()
{
    
register_plugin"Menu desde .ini""1.2""[R]ak" );
    
    
register_clcmd"say /test""test_say" );
}

public 
plugin_cfg( )
{
    new 
Archivo[64], buffer[128], nitem[2]
    
    
get_configsdir(Archivocharsmax(Archivo))
    
    
add(ArchivocharsmaxArchivo ), "/mis_menus.ini")    
    
    if(!
file_exists(Archivo))
        
crear_archivo(Archivo)
    
    new 
File fopen(Archivo"rt")
    
    while(!
feof(File)) {
        
        
fgets(Filebuffercharsmax(buffer))
        
        
trim(buffer)
        
        if(!
buffer[0] || buffer[0] == ';')
            continue;
            
        if(
buffer[0] == '*') {
            
            
item[0] = n
            
            menu_additem
(menu[n-1], buffer[2], item)
            
        }
        else            
            
menu[n++] = menu_create(buffer"mimenu_handler")
            
    }
}

public 
test_sayid )
{
    
menu_displayidmenu[0] );
    
    return 
PLUGIN_HANDLED;
}

crear_archivoArchivo[ ] )
{
    new 
File fopenArchivo"wt" );
    
    
fprintfFile"; Menu desde .ini 1.2^n; Nombre del Menu^n; * opcion1^n;* opcion2" );
    
    
fcloseFile );
}

public 
mimenu_handleridmenuitem )
{
    if( 
item == MENU_EXIT )
        return;
    
    new 
iData], iName64 ], iAccessiCallback;
    
    
menu_item_getinfomenuitemiAccessiDatacharsmaxiData ), iNamecharsmaxiName ), iCallback );
    
    
client_printidprint_chat"Has elejido: %d. %s"iData], iName );


Lo teste con el .ini asi:

Quote:

Menu 1
* opcion1
* opcion2
* opcion3

Menu 2
* asd
* asd2

Menu 3
* 1234
* testeo
__________________
Discord:FluffyDeveloper#4753
Github: https://github.com/francoromaniello
AMX-ES: https://amxmodx-es.com/r0ma'

Last edited by r0ma; 10-07-2012 at 02:33.
r0ma is offline
Send a message via MSN to r0ma
SicknessArG
Junior Member
Join Date: Oct 2012
Location: Paraná, Entre Ríos (ARG)
Old 10-07-2012 , 00:28   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #6

Sry, no habia prestado atencion al amxmisc, pense que lo habia dejado.
Esa es otra opcion, sin embargo trabaja exactamente igual, solo que yo defino la cantidad de items y su nombre en global.
SicknessArG is offline
Send a message via MSN to SicknessArG Send a message via Skype™ to SicknessArG
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 10-07-2012 , 03:18   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #7

Array dinámico para este tipo de plugins, nunca sabes si hay personas que superan ese límite, además es más cómodo.
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).

gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
rak
Veteran Member
Join Date: Oct 2011
Location: banned country
Old 10-07-2012 , 03:56   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #8

Quote:
Originally Posted by gladius View Post
Array dinámico para este tipo de plugins, nunca sabes si hay personas que superan ese límite, además es más cómodo.
PHP Code:
#include <amxmodx>
#include <amxmisc>

new Array:g_Menus

public plugin_init() {
    
    
register_plugin"Menu desde .ini""1.2""[R]ak" )
    
    
load_menus()
    
}

load_menus() {
    
    new 
Archivo[64], buffer[128], menuitem[2], n
    
    g_Menus 
ArrayCreate(21)
    
    
get_configsdir(Archivocharsmax(Archivo))
    
    
add(ArchivocharsmaxArchivo ), "/mis_menus.ini")    
    
    if(!
file_exists(Archivo))
        
crear_archivo(Archivo)
    
    new 
File fopen(Archivo"rt")
    
    while(!
feof(File)) {
        
        
fgets(Filebuffercharsmax(buffer))
        
        
trim(buffer)
        
        if(!
buffer[0] || buffer[0] == ';')
            continue;
        
        if(
buffer[0] == '*') {
            
            
item[0] = n
            
            menu_additem
(menubuffer[2], item)
            
        }
        else {
            
            
menu menu_create(buffer"mimenu_handler")
            
            
item[0] = menu
            
            n
++
            
            
formatex(buffercharsmax(buffer), "say /menu%d"n)
            
            
item[1] = register_clcmd(buffer"cmdMenu")
            
            
ArrayPushArray(g_Menusitem)
            
            
item[1] = 0
            
        
}
        
    }
}

public 
cmdMenu(idlevelcid) {
    
    static 
ASizeiItems[2]
    
    if(!
ASize)
        
ASize ArraySize(g_Menus)
    
    for(
0ASizei++) {
        
        
ArrayGetArray(g_MenusiItems)
        
        if(
Items[1] == cid) {
            
            
menu_display(idItems[0])
            
            break;
        
    }
            
    return 
PLUGIN_HANDLED
    
}

crear_archivo(Archivo[]) {
    
    new 
File fopen(Archivo"wt")
    
    
fprintf(File"; Menu desde .ini 1.2^n; Nombre del Menu^n; * opcion1^n;* opcion2")
    
    
fclose(File)
    
}

public 
mimenu_handler(idmenuitem) {
    
    if(
item == MENU_EXIT)
        return
    
    new 
iData[2], iName[64], iAccessiCallback
    
    menu_item_getinfo
(menuitemiAccessiDatacharsmax(iData), iNamecharsmax(iName), iCallback)
    
    
client_print(idprint_chat"Has elejido %s del menu %d"iNameiData[0])
    

__________________

www.amxmodx-es.com

Steam: Luchokoldo

Last edited by rak; 10-07-2012 at 03:58.
rak is offline
Send a message via MSN to rak Send a message via Skype™ to rak
xLeoNNN
Veteran Member
Join Date: Sep 2010
Location: de_dust2
Old 10-07-2012 , 13:57   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #9

yo había echo un menú de modelos hace un tiempo atras mediante un .ini, donde ponias por ejemplo
"Opcion del menu" "Descripcion" "Modelo.mdl" (pero sin el .mdl xD)
__________________

Last edited by xLeoNNN; 10-07-2012 at 13:57.
xLeoNNN is offline
Send a message via MSN to xLeoNNN
AfteR.
Veteran Member
Join Date: Dec 2008
Location: λ
Old 10-07-2012 , 20:09   Re: [GUIA] Crear Menu desde archivo *.ini.
Reply With Quote #10

Quote:
Originally Posted by SicknessArG View Post
ACLARACIÓN!! Antes de irme puteando con que la guía esta hecha así nomas y etc, quiero aclararles que soy malísimo explicando, pero me esfuerzo para mejorarlo...Si alguno tiene una crítica constructiva o una sugerencia bien detallada le agradecería que lo postee.
De nuevo aclaro, no soy bueno explicando, solo se lo que hay que hacer.
La guía está bien. Tampoco está muy detallada, pero para usuarios con conocimientos relativamente intermedios basta para que sea "entendible".

Gracias por el aporte, ya hacía falta uno así porque el 80% de "tutoriales" son guías para hacer copy y paste y no para aprender.

Last edited by AfteR.; 10-07-2012 at 20:10.
AfteR. is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 01:46.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode