Menu de armas por archivo externo [.ini]
#1
Menu de armas por archivo externo [.ini]


Hice este pequeño plugin donde podemos agregar/editar armas a gusto con el nombre que querramos.

Ejemplo del archivo weapons.ini (Por defecto)
Código:
;[Nombre del arma]     [weapon_*]
;Para evitar problemas, poner el nombre del arma entre comillas
"M4A1"                 weapon_m4a1
"Ak-47"             weapon_ak47
"DK"                 weapon_deagle
"P90"                 weapon_p90

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

// Índice del menú.
new g_iMenu

// Cantidad de armas registradas.
new g_iWeaps

// Archivo dentro de la carpeta de config, donde leeremos las armas.
new const szFile[] = "weapons.ini"

// Cartuchos máximos de las armas.
new const MAXBPAMMO[] = { -152, -1901321100901120100100909090,
100120301202003290120902359090, -1100 }

public 
plugin_init()
{
    
register_plugin("Menu de Armas""1.1""alan_el_more")
    
    
// Registramos el menú.
    
g_iMenu menu_create("Menu de armas""HandlerMenu")
    
    
// Leemos el archivo
    
ReadFile()
    
    
// Comando para abrir el menú
    
register_clcmd("say /weapons""Clcmd_Weapons")
}

ReadFile()
{
    
// Creamos unos arrays
    
new szDirFile[100], szData[52], szWeapName[32], szWeapItemName[20]
    
    
// Obtenemos el directorio de las configuraciones (Por defecto: addons/amxmodx/configs/)
    
get_configsdir(szDirFilecharsmax(szDirFile))
    
    
// Le damos formato a lo que sería el directorio del archivo a leer
    
format(szDirFilecharsmax(szDirFile), "%s/%s"szDirFileszFile)
    
    
// Abrimos el archivo para leer texto
    // 'r' - Read (Leer)
    // 't' - Text (Texto)
    
new file fopen(szDirFile"rt")
    
    
// Si el archivo no existe...
    
if(!file)
    {
        
// Informamos que no se encontró y retornamos la función
        
server_print("Error: Archivo %s no encontrado"szDirFile)
        return
    }

    
// Mientras no sea la última linea...
    
while(!feof(file))
    {
        
// Obtenemos el texto de la línea
        
fgets(fileszDatacharsmax(szData))
        
        
// Removemos las comillas al principio y al final del texto
        
trim(szData)
        
        
// Si no hay texto a leer o el texto empieza con ; (Punto y coma),
        // continuamos al paso en el bucle. En este caso, en la siguiente línea del archivo.
        
if(!szData[0] || szData[0] == ';')
            continue
        
        
// Separamos los datos y si se encuentran menos de dos datos,
        // continuamos a la siguiente línea.
        
if(parse(szDataszWeapNamecharsmax(szWeapName), szWeapItemNamecharsmax(szWeapItemName)) < 2)
            continue
        
        
// Si no hay un nombre de arma ingresado o si el dato weapon_* obtenido
        // es invalido, vamos a la siguiente línea.
        
if(!szWeapName[0] || !get_weaponid(szWeapItemName))
            continue
        
        
// Pasamos todos los filtros, ya podemos agregar el item al menú.
        
menu_additem(g_iMenuszWeapNameszWeapItemName)
        
        
// Incrementamos el valor de esta variable para saber
        // la cantidad de armas registradas.
        
g_iWeaps++
    }
    
    
// Cerramos el archivo ya que no necesitamos usarlo más.
    
fclose(file)
    
    
// Si tenemos más de 7 armas registradas...
    
if(g_iWeaps 7)
    {
        
// Le damos nombre a los items para avanzar/retroceder de página.
        
menu_setprop(g_iMenuMPROP_BACKNAME"Atras")
        
menu_setprop(g_iMenuMPROP_NEXTNAME"Siguiente")
    }
    
    
// Le damos nombre al item para salir del menú.
    
menu_setprop(g_iMenuMPROP_EXITNAME"Salir")
}

// Comando ingresado...
public Clcmd_Weapons(id)
{
    
// Si el usuario está vivo y hay armas registradas...
    
if(is_user_alive(id) && g_iWeaps)
    {
        
// Le mostramos el menú.
        
menu_display(idg_iMenu)
    }
    
    
// Para que no muestre que el usuario ingresó el comando...
    
return PLUGIN_HANDLED
}

// Item seleccionado...
public HandlerMenu(idmenuitem)
{
    
// Si el usuario ha elegido salir del menú...
    
if(item == MENU_EXIT)
    {
        
// Terminamos la función
        
return PLUGIN_HANDLED
    
}
    
    
// Si el usuario no está vivo...
    
if(!is_user_alive(id))
    {
        
// Le imprimimos un mensaje en el chat al usuario
        
client_print(idprint_chat"Debes estar vivo")
        
        
// Terminamos la función
        
return PLUGIN_HANDLED
    
}
        
    
// Array y una variable inservible...
    
new szWeap[20], Useless
    
    
// Obtenemos los datos del menú
    
menu_item_getinfo(menuitemUselessszWeapcharsmax(szWeap), __Useless)
    
    
// Obtenemos el índice del arma elegida.
    
new iWeapID get_weaponid(szWeap)
    
    
// Le damos el arma elegida.
    
give_item(idszWeap)
    
    
// Si necesita cargadores...
    
if(MAXBPAMMO[iWeapID])
    {
        
// Se los damos.
        
cs_set_user_bpammo(idiWeapIDMAXBPAMMO[iWeapID])
    }
    
    return 
PLUGIN_HANDLED


Cambios:
Código:
1.0 - Publicación
1.1 - formatex -> format
        Cambio en nombre de variables
        Agregado chequeo si no se ingresó nombre del arma
1.1.1 - Pequeñas optimizaciones (Gracias mongolito)

Cualquier duda, consulta, error o crítica constructiva, serán bienvenidos en los comentarios o por mensaje privado.


Archivos adjuntos
.sma   Descargar AMXX / weap_menu.sma (Tamaño: 4.32 KB / Descargas: 171)

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#2
Hm bastante interesante, buen aporte ^^
[Imagen: 76561198066347799.png]
Responder
#3
Buen aporte!
Responder
#4
Buen aporte!

@Mario AR. ¿Qué diferencia hay con format y formatex? Lo que tenía entendido es que el funcionamiento es el mismo nada más que formatex es más rápido y eficaz.
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#5
(16/08/2014, 02:01 AM)Federicomb escribió: Buen aporte!

@Mario AR. ¿Qué diferencia hay con format y formatex? Lo que tenía entendido es que el funcionamiento es el mismo nada más que formatex es más rápido y eficaz.

No es mas eficaz solo mas rápido pero cuando es como en este caso se usa format q crea un array temporal donde se guarda los datos y dsp los copia al buffer

Alan lindo tut yo le agregaría una autocreacion del archivo
Código PHP:
// Cuando no sea la última linea... 
--------------->
Código PHP:
// Mientras no sea la última linea... 
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#6
Interesante... , se le pudiera agregar como EJ: el DragonCannon que lo conseguis por la consola poniendo: admin_get_cannon . El Cannon seria la m249 la machine pero si sacas la machine y lo pones se puede???

En el INI agregar DragonCannon:

Código PHP:
"Weapon Names"  "weapon_*"
Dragon Cannon    "weapon_m249" 

Capaz que si pero es medio dificil, Se puede(?
"El camino de pies y manos" Tae Kwon Do
Responder
#7
oye una pregunta
Código PHP:
formatex(szFilecharsmax(szFile), "%s/%s"szFileszDirFile

se que no tiene nada que ver pero por que esta alreves?

szFile = archivo x

szDirFile = directorio del archivo x

se que no tiene nada que ver pero algunos se pueden confundir con eso ya que en la mayoria de los plugins es alrevez.
Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
[Imagen: b_350_20_5A6C3E_383F2D_D2E1B5_2E3226.png]

(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

Responder
#8
(16/08/2014, 02:26 PM)Hackeloff escribió: Interesante... , se le pudiera agregar como EJ: el DragonCannon que lo conseguis por la consola poniendo: admin_get_cannon . El Cannon seria la m249 la machine pero si sacas la machine y lo pones se puede???

En el INI agregar DragonCannon:

Código PHP:
"Weapon Names"  "weapon_*"
Dragon Cannon    "weapon_m249" 

Capaz que si pero es medio dificil, Se puede(?

Eso ya lo podes hacer editando este plugin.

(16/08/2014, 06:49 PM)Sugisaki escribió: oye una pregunta
Código PHP:
formatex(szFilecharsmax(szFile), "%s/%s"szFileszDirFile

se que no tiene nada que ver pero por que esta alreves?

szFile = archivo x

szDirFile = directorio del archivo x

se que no tiene nada que ver pero algunos se pueden confundir con eso ya que en la mayoria de los plugins es alrevez.

Arreglado

----

Gracias por los comentarios/aportes

Actualizado

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#9
Este chequeo hacelo antes de crear las variables y llamar a menu_item_getinfo()
Código PHP:
if(!is_user_alive(id))
    {
        
// Le imprimimos un mensaje en el chat al usuario
        
client_print(idprint_chat"Debes estar vivo")
        
        
// Terminamos la función
        
return PLUGIN_HANDLED
    

[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#10
me gusta, estaria bueno que tambien puede cambiar de model desde el ini, pero eso lo puedo acer yo muy bien
Crab Crab Crab Crab
Responder
#11
(17/08/2014, 03:13 PM)ivan escribió: me gusta, estaria bueno que tambien puede cambiar de model desde el ini, pero eso lo puedo acer yo muy bien

No le contesto a un usuario retirado
Hazlo muchacho
-------
Actualizado

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#12
1.1.1 - Pequeñas optimizaciones (Gracias mongolito)
----------->
1.1.1 - Pequeñas optimizaciones (Gracias mongito100)

Sigo y sigo encontrando errores
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#13
(18/08/2014, 07:28 PM)mongito100 escribió: 1.1.1 - Pequeñas optimizaciones (Gracias mongolito)
----------->
1.1.1 - Pequeñas optimizaciones (Gracias mongito100)

Sigo y sigo encontrando errores

Mensaje reportado

Gracias, lo voy a tener en cuenta

Está todo bien ya, no hay que actualizar nada más.

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)