Hola gente como andan, aca les vengo a dejar la 2º parte de este tutorial de programación... si no viste la primera, te recomiendo que la veas Haciendo click Aca
Bien, en el primer post aprendimos que para la programación se necesita un buen humor, tener paciencia e imaginación y estar decidido a hacer las cosas porque no se pueden dejar a la mitad. Eso en la parte psicológica, y en lo practico, aprendimos que son las variables y para que sirven.
Hoy vamos a aprender un poco mas para que sirven los Módulos y a hacer un simple Menú
Módulos
Los Módulos o Librerías son por decir, los contenedores de todas las funciones o mejor conocidos como natives que vamos a utilizar en un plugin, desde darle vida a un usuario, hasta matarlo o detectar en que equipo esta.
Los módulos básicos que un plugin puede llegar a utilizar son:
- Amxmodx [Nivel Básico]: Contiene las funciones básicas del programa Amx y del lenguaje Pawn
- Amxmisc [Nivel Básico]: Al igual que el anterior, contiene funciones básicas del programa y del lenguaje Pawn
- Cstrike [Nivel Básico]: Este modulo contiene funciones del juego al que estamos programando, osea CS, en este caso, contiene las IDS de las armas que ya veremos mas adelante, modelos del juego y equipos, entre otros.
- Fun [Nivel Básico]: Este modulo contiene funciones básicas y fáciles de usar, ya que los nombres de sus funciones son casi todos en ingles y sin ninguna complicación, que pueden servir, entre muchas otras cosas, para cambiar la vida, chaleco, gravedad y velocidad entre otros.
- Fakemeta [Nivel Medio]: Este modulo ya pasa a ser un nivel un poco mas avanzado, es un poco mas optimizado en cuanto a rendimiento y consumo de pc pese que el modulo FUN y tiene funciones similares, casi todas las funciones de fun están también en Fakemeta. Este modulo es mas diverso, ya que contiene hasta otro tipo de registro en el plugin init, cada una de sus funciones tiene uno diferente. También, contiene funciones para cambiar daño de los usuarios, modelos y hasta para modificar armas, ya sea en daño, velocidad de tiro, calibración de mira y muchas cosas mas. Uno de los mas importantes a mi gusto.
- Hamsandwich [Nivel Medio]: Hamsandwich, tiene casi todas las funciones de FUN, y alguna que otra de Fakemeta.Es mas optimizado y consume menos que ambos Módulos aunque
Fakemeta tiene otros usos tambien. Las funciones basicas de Hamsandwich son las mismas que la de FUN pero tiene otro tipo de registro en el plugin init y tambien tiene otras funciones para cambiar los modelos de los usuarios, cambiar propiedades de las armas y de los usuarios, entre muchas otras cosas mas.
- SQL [Nivel Avanzado]:Este modulo sirve para hacer conexiones a bases de datos, es un nivel muy avanzado, sus funciones son usadas básicamente para sistemas de cuentas y de guardado.
Entre otros modulos, estos son los mas usados para aprender lo basico.
Los modulos como bien vimos en el primer tutorial, se "incluyen" en el plugin a través de el codigo
#include
Vamos a hacer que un player, al escribir /heal recupere la vida perdida usando el modulo FUN.
#include
#include
#include
#define PLUGIN "Vida" // nombre del plugin
#define VERSION "1.0" // version del plugin
#define AUTHOR "Codes" // autor del plugin
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR) // registramos el plugin con las definiciones que dimos al inicio
register_clcmd( "/heal", "clcmd_heal" ) // registramos el comando y el callback del mismo
}
public clcmd_heal(id) // publicamos el callback( donde diremos que hacer cuando coloque el comando) del comando
{
set_user_health(id, 100) // Lo que hicimos acá es a través del native "set_user_health" del modulo FUN le dimos o seteamos(dicho de la forma villera) 100 de vida, así de simple.
return PLUGIN_HANDLED // damos por concluido el callback
} // cerramos la función y terminamos
Y de esa forma le seteamos 100 de vida a el usuario usando el modulo fun, les voy a dejar ACA una lista de todas las funciones de todos los módulos, les recomiendo que se vallan aprendiendo los que comienzan con "set_", "get_"cs_set" y "cs_get" porque son los que vamos a usar por el momento, mas adelante los van a ir aprendiendo solos...
Menu Simple
Los Menús simples se ven como en esta imagen:
Y se hacen de la siguiente manera:
#include
#include
#include
#include
#define PLUGIN "Menu Simple"
#define VERSION "1.0"
#define AUTHOR "Codes"
public plugin_init(){
register_clcmd("/menu", "clcmd_menu" )
}
public clcmd_menu(id)
{
new menu = menu_create("Titulo","menu_callback" ) // ponemos titulo y el callback
menu_additem(menu, "Comprar 100 de Vida r- y$600", "1", 0) // aca agregamos la opcion al menu, le damos nombre y le damos su orden, en este caso va a ser la opcion "1" )
menu_additem(menu, "Comprar 100 de Chaleco r- y$200", "2", 0) // en este caso, la opcion seria la numero "2"
menu_setprop(menu, MPROP_EXITNAME, "Salir" ) // le damos el nombre al boton "Salir" osea el 0 por defecto
menu_display(id, menu, 0)
}
public menu_callback(id, menu, item) // ATENCION, a como se publica el callback de un menu.
{
if(item == MENU_EXIT) // *1 explicacion mas abajo de el condicional "if"
{
menu_destroy(menu)
return PLUGIN_HANDLED
} // en este condicional hacemos que si el usuario elije el numero "0" osea "Salir" se cierre el menu
new data[6], iName[64], access, callback // creamos unas variables estáticas
menu_item_getinfo(menu, item, access, data, 5, iName, 63, callback) //obtenemos a traves de las variables la info del menu
switch(str_to_num(data)) // codificamos los datos a numeros a traves de "switch"
{
case 1: // en el caso de que haya elegido el numero "1" osea, comprar vida
{
if(cs_get_user_money(id) >= 600) // vemos si el usuario tiene mayor o igual cantidad de dinero que el precio
{
cs_set_user_money(id, cs_get_user_money(id) - 600) // le restamos al dinero del valor del item a traves de un native del modulo "cstrike" como pueden ver, contiene un "cs_" adelante.
set_user_health(id, get_user_health(id) + 100) // en caso de que la tenga, nos fijamos la vida que tiene, y le sumamos 100
} // cerramos el if
else // *1 explicacion de condicionales mas abajo
client_print(id, print_chat, "[Server] Sos pobre y no tenes plata" // en caso de que no lo tenga, le enviamos un mensaje de que es pobre
} // cerramos el case 1
case 2: // en el caso de que haya elegido el numero "2" osea, comprar chaleco
{
if(cs_get_user_money(id) >= 200) // nos fijamos si tiene una cantidad mayor o igual de dinero al precio
{
cs_set_user_money(id, cs_get_user_money(id) - 200) // le restamos el dinero del valor del item
set_user_armor(id, get_user_armor(id) + 100) // le damos el chaleco y cerramos el if
}
else // en caso de que no tenga el dinero
client_print(id, print_chat, "[Server] yo que vos me dedico a vender ajo porque estas cortado" // y le mandamos un mensaje de que es pobre.
} // cerramos case 2
} // cerramos switch
menu_destroy(menu) // cerramos el menu cuando elige una opcion
return PLUGIN_HANDLED
} // damos por finalizada la funcion, y con esto, finalizamos el plugin y el menu.
Los condicionales sirven para hacer la pregunta "si...", "sino...", "sino, si...", que son las traducciones de las palabras "if", "else", "else if", y con ellas lo que logramos es preguntar si el usuario es, tiene, o hizo tal cosa, en este caso, si leemos el codigo como lo haria la maquina, en el primer if del case 1, seria algo asi "si la obtencion de el dinero del usuario es mayor o igual a 600" ... y seguido abrimos la llave que explica que va a pasar en ese caso, si seguimos leyendo como lo haria lo computadora: "se le va a establecer, obteniendo el dinero del usuario, una resta de 600", y si leemos la linea de mas abajo: "y se le va a establecer al usuario, segun la vida que tenga, un aumento de 100", entonces asi le cobramos el valor del item que eligio y le damos el mismo. En el caso de "else", nunca puede haber uno sin un "if" ya que significaria "sino..." y si leemos como va a interpretar el codigo la maquina, quedaria algo asi: "sino(osea si la obtencion de el dinero del usuario no da un numero mayor al precio, osea 600)", bajamos una linea y abrimos que pasara... seguimos leyendo: "enviamos un mensaje a traves del chat diciendo que pobre y no tiene plata".
En el caso del "else if", que en este caso no usamos, el termino "sino si" sirve para hacer varias opciones seguidas en vez de poner todo el tiempo "if", con el tiempo y la practica van a ir viendo y entendiendo, por el momento no se me ocurre otra forma de explicarlo.
Les recomiendo que cuando vallan haciendo algun plugin y les salte algun error que no entiendan, o por simple seguridad de que lo estan haciendo bien, se pongan a leer lo que la computadora razonaria con ese codigo, para esto necesitan entender bien para que sirve cada native y como funciona, no es muy dificil y te facilita MUCHISIMO las cosas, en caso de plugins cortos no es un problema, pero cuando te encaminas a plugins largos como mods o cosas asi, es muy estresante recorrer linea tras linea sin ver errores y que el compilador te diga que tenes uno. El compilador te va a tirar siempre una linea, pero a veces el error esta en la funcion completa, o tambien cuando pones algo que no tiene sentido y se contradiga.
Antes de irte
Y si no te gusto el post, es porque...