16/08/2014, 12:03 AM (Última modificación: 18/08/2014, 08:57 AM por alan_el_more.)
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
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(szDirFile, charsmax(szDirFile))
// Le damos formato a lo que sería el directorio del archivo a leer format(szDirFile, charsmax(szDirFile), "%s/%s", szDirFile, szFile)
// 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(file, szData, charsmax(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(szData, szWeapName, charsmax(szWeapName), szWeapItemName, charsmax(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_iMenu, szWeapName, szWeapItemName)
// 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_iMenu, MPROP_BACKNAME, "Atras") menu_setprop(g_iMenu, MPROP_NEXTNAME, "Siguiente") }
// Le damos nombre al item para salir del menú. menu_setprop(g_iMenu, MPROP_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(id, g_iMenu) }
// Para que no muestre que el usuario ingresó el comando... return PLUGIN_HANDLED }
// Item seleccionado... public HandlerMenu(id, menu, item) { // 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(id, print_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(menu, item, Useless, szWeap, charsmax(szWeap), _, _, Useless)
// Obtenemos el índice del arma elegida. new iWeapID = get_weaponid(szWeap)
// Le damos el arma elegida. give_item(id, szWeap)
// Si necesita cargadores... if(MAXBPAMMO[iWeapID]) { // Se los damos. cs_set_user_bpammo(id, iWeapID, MAXBPAMMO[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.
@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 ❤
@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
16/08/2014, 02:26 PM (Última modificación: 16/08/2014, 02:27 PM por Hackeloff.)
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???
(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?
(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???