Jump to content
Sign in to follow this  
totopizza

[TUT] Niveles por macro

Recommended Posts

Nombre: Niveles por macro

Author: Metrikcz

Imágenes: No hay...

Fuente: [TUT] Niveles por macro

 

Resto del Tutorial:

 

Bueno aquí les dejo un sistema de levels por macro

Aclaro que este sistema sirve para cualquier MOD

 

#include <amxmodx>
#include <hamsandwich> // Lo usaremos para registrar el event cuando el jugador muere

#define PLUGIN "Tutorial Levels" // Nombre de plugin
#define VERSION "1.0" // Version
#define AUTHOR "Metrikcz" // Author

// Macro, en este definiremos la cantidad de experiencia que se ocupara para cada nivel, es una operacion
// donde %1 es el level del usuario, Por ejemplo:
// si es level 8 el resultado seria: 640 --- > 8 * 8 * 10 = 640
// El macro ustedes lo pueden definir a como ustedes quieran la operacion, como la sientan mas comoda
#define level_up(%1) (%1 * %1 * 10)

// Variables donde almacenaremos el nivel y experiencia del jugador
new g_level[33], g_exp[33]

// Variable de la cvar
new cvar_expkill, cvar_maxlevel
new menu
public plugin_init() 
{
   // Registramos el plugin
   register_plugin(PLUGIN, VERSION, AUTHOR)

   // registramos el evento cuando alguien muere
   RegisterHam(Ham_Killed, "player", "fw_playerkilled_post", 1)

   // Registramos el comando para que el usuario vea su level y para que vea la exp de cada level
   register_clcmd("say /level", "clcmd_saylevel")
   register_clcmd("say /levels", "clcmd_saylevels")

   // registramos la cvar 
   cvar_expkill = register_cvar("exp_kill", "25")
   cvar_maxlevel = register_cvar("maxlevel", "100")

   // Creamos el menu, global porque nunca cambiara amenos que cambien el valor de la cvar de maxlevel
   create_menu()
}
create_menu()
{
   // Creamos el menu, primer parametro nombre del menu, el segundo es el handler
   menu = menu_create("Tutorial Sistema de Levels | Experiencia para cada level", "handler_menu")

   //Creamos una variable en la cual guardaremos el valor de el level maximo
   new len[40], maxlevel = get_pcvar_num(cvar_maxlevel)

   // Lopeamos entre todos los posibles levels
   for(new i = 0; i < maxlevel; i++)
   {
       formatex(len, charsmax(len), "\wLevel: \y%d - \r%i", i+1, level_up(i))
       menu_additem(menu, len, "1") // tercer parametro no importa
   }
}
// Foward Cuando el usuario entra al servidor
public client_putinserver(id)
{
   // Reiniciamos los valores de level y experiencia
   g_level[id] = 1
   g_exp[id] = 0
}
public fw_playerkilled_post(victim, attacker)
{
   // chequeamos si el atacante esta conectado, si no lo esta ignoramos la funcion
   if(!is_user_connected(attacker))
       return HAM_IGNORED;

   // chequeamos si la victima es igual al attacker, osea si el jugador se suicido
   if(victim == attacker)
       return HAM_IGNORED;

   // Llamamos a la funcion donde al atacante le daremos la experiencia de la cvar
   // get_pcvar_num(cvar_exp_kill) Obtiene el valor de la cvar para darle la exp de la cvar
   // Primer parametro define para quien va la experiencia y el segundo la cantidad
   set_exp(attacker, get_pcvar_num(cvar_expkill))

   // Le mandamos un mensaje disiendo que gano "X" experiencia por matar
   client_print(attacker, print_chat, "Ganas %d Experiencia por Matar", get_pcvar_num(cvar_expkill))
   return HAM_IGNORED;
}
set_exp(id, exp)
{
   // Le damos al usuario la experiencia del segundo parametro "exp"
   g_exp[id] += clamp(exp, 0, level_up(get_pcvar_num(cvar_maxlevel)))

   //Llamamos a esta funcion para checar su ha subido de nivel
   update_level(id)
}
update_level(id)
{
   // Checamos si su experiencia es mayor o igual a la necesaria para su siguiente nivel y si no es el level maximo, por ejemplo:
   // Digamos que es level 5, la experiencia necesaria para su siguiente level es 250 deacuerdo al macro (5*5*10=250)
   // si su exp es 253 muy bien se cumple la condicion y subira de level
   // level_up(g_level[id]) == level_up(5) porque suponiendo que g_level[id] es 5 asi seria
   while(g_exp[id] >= level_up(g_level[id]) && g_level[id] < get_pcvar_num(cvar_maxlevel))
   {
       // Aumentamos su level
       g_level[id]++
       /* g_level[id] += 1 || es lo mismo que lo de arriba */

       // Mandamos un mensaje disiendo que subio de level
       client_print(id, print_chat, "Felicidades has ascendido al level: %d", g_level[id])
   }
}
public clcmd_saylevel(id)
{
   // Mandamos un mensaje mostrando su level y experiencia
   client_print(id, print_chat, "Su level: %d / %d| Experiencia: %d / %i", g_level[id], get_pcvar_num(cvar_maxlevel), g_exp[id], level_up(g_level[id]))

   // Mandamos un return plugin_handled para que no salga en el say cuando el wey escribe /level
   // Regularmente no deberia de salir pero a algunos servers se les bugea el say (zp) y si aparece
   return PLUGIN_HANDLED;
}

public clcmd_saylevels(id)
   menu_display(id, menu, 0)

public handler_menu(id, menu, item)
{
   // si no le pico al 0, osea para salir del menu, le mostraremos el menu de nuevo
   if(!(item == MENU_EXIT))
       clcmd_saylevels(id)
} 

 

say /level - Vemos el level del usuario y level maximo y tambien vemos su exp y experiencia necesaria para su siguiente level

say /levels - Vemos la lista de levels y la experiencia que se necesita para cada uno!

Share this post


Link to post
Share on other sites

Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...