Ir al contenido

[TUT] Crear CVARs


Oops!

Posts recomendados

CREAR CVARs

Las CVARs son algo a tener en cuenta al crear plugins. Es una manera de facilitar la manupulación de determinados aspectos del plugin, y también nos ahorra el trabajo de tener que editar el .sma y volver a compilar constantemente.

¿Cómo se crean? Simple:

register_cvar("nombre_cvar", "valor_pordefecto") // esto dentro de plugin_init()

Como primer ejemplo, hagamos un plugin que nos dé X cantidad de plata al escribir /plata, y que se pueda utilizar cada X segundos. Para esto, vamos a utilizar las siguientes funciones:

cs_get_user_money(id) //para saber la plata que tiene
cs_set_user_money(id) //para setear la plata que va a tener

También vamos a necesitar:

get_pcvar_num(variabledelacvar) //obtiene el valor actual de una cvar; esto es un integer (nº entero)
get_pcvar_float(variabledelacvar) //lo mismo, pero esto es un float (nº decimal)

Vayamos al plugin en sí:

Spoiler
#include <amxmodx>
#include <cstrike> // .inc que contiene la funcion para el dinero

// creamos variables para las diferentes cvars
new cvar_on, cvar_plata, cvar_tiempo
new puede_recibir // esta variable es para chequear si ya paso el tiempo para poder
		  // usarlo de nuevo
public plugin_init()
{
  	register_plugin("Dar Plata", "1.0", "Nadie") //registramos el plg
  	
  	register_clcmd("say /plata", "darplata") //al escribir plata por say
  	register_clcmd("say_team /plata", "darplata") //o say_team, se llama a "darplata"
  
  	cvar_on = register_cvar("plata_on", "1") //plugin on/off
  	cvar_plata = register_cvar("plata_cantidad", "500") //cantidad de plata que recibiremos
  	cvar_tiempo = register_cvar("plata_tiempo", "10.0") //cada cuantos segs.
}

public client_putinserver(id) // esto se llama cuando el cliente entra al sv
{
  	puede_recibir = true //cuando entra tiene que poder usar el cmd
}  

public darplata(id) // lo que va a hacer esta funcion
{
  	if(get_pcvar_num(cvar_on) == 0) //si el valor de cvar_on es 0 
  	return PLUGIN_HANDLED //paramos la funcion, ya que el plg esta off
  
  	if(!is_user_alive(id)) //si no esta vivo...
  	return PLUGIN_HANDLED //no podemos darle plata, por lo tanto
  		    	      //paramos la ejecucion de la funcion
  
  	if(!puede_recibir) //si todavia no paso el tiempo asignado,
  	return PLUGIN_HANDLED // tamb paramos la ejecucion
  
  	//seteamos la plata; a lo que ya tiene, le sumamos el valor que indica "cvar_plata"
  	cs_set_user_money(id, cs_get_user_money(id) + get_pcvar_num(cvar_plata))
  
  	//hacemos un task, que se va a activar cuando haya pasado el tiempo especificado
  	//@param 1: tiempo (float) 
    	//@param 2: funcion que se va a activar al pasar ese tiempo
   	//@param 3: id unico del task; lo vamos a usar despues  
     	set_task(get_pcvar_float(cvar_tiempo), "reset", 1234)  
 	return PLUGIN_HANDLED // damos fin a la funcion "darplata"
}

public reset() // al pasar el tiempo definido por cvar_tiempo...
{
  	puede_recibir = true // hacemos true a esta variable para que pueda volver a usar el cmd
}

public client_disconnect(id) //se llama cuando el player se desconecta
{
  	if(task_exists(1234)) //si el task todavia estaba siendo ejecutado cuando se fue...
  	remove_task(1234) //lo borramos
}  

 

Así como está, hay un detalle que el plugin no tiene en cuenta, que es lo siguiente: si se muere sin que se haya cumplido el tiempo especificado en el set_task, hay una posibilidad de que no pueda usar el comando /plata en los primeros segundos de la ronda sguiente, ya que ese tiempo todavía no pasó. Para evitar eso, podemos usar lo siguiente:

register_event("DeathMsg", "event_muerte", "a") // en plugin_init()

/* "DeathMsg" : nombre del event
   "event_muerte" : nombre de la funcion que se llama cuando muere
   "a" : flag (atributo), la "a" significa que es global y se aplica a todos los jugadores */
												

En otro post voy a entrar más en detalle sobre la función register_event(). Por ahora basta con saber que esto sirve para captar el momento en el que un jugador muere.

Entonces, agregando eso, el plugin quedaría así:

Spoiler
#include <amxmodx>
#include <cstrike> // .inc que contiene la funcion para el dinero

// creamos variables para las diferentes cvars
new cvar_on, cvar_plata, cvar_tiempo
new puede_recibir // esta variable es para chequear si ya paso el tiempo para poder
		  // usarlo de nuevo
public plugin_init()
{
  	register_plugin("Dar Plata", "1.0", "Nadie") //registramos el plg
  
  	register_event("DeathMsg", "event_muerte", "a") // ACA LA NUEVA FUNCION
  	
  	register_clcmd("say /plata", "darplata") //al escribir plata por say
  	register_clcmd("say_team /plata", "darplata") //o say_team, se llama a "darplata"
  
  	cvar_on = register_cvar("plata_on", "1") //plugin on/off
  	cvar_plata = register_cvar("plata_cantidad", "500") //cantidad de plata que recibiremos
  	cvar_tiempo = register_cvar("plata_tiempo", "10.0") //cada cuantos segs.
}

public client_putinserver(id) // esto se llama cuando el cliente entra al sv
{
  	puede_recibir = true //cuando entra tiene que poder usar el cmd
}  

public darplata(id) // lo que va a hacer esta funcion
{
  	if(get_pcvar_num(cvar_on) == 0) //si el valor de cvar_on es 0 
  	return PLUGIN_HANDLED //paramos la funcion, ya que el plg esta off
  
  	if(!is_user_alive(id)) //si no esta vivo...
  	return PLUGIN_HANDLED //no podemos darle plata, por lo tanto
  		    	      //paramos la ejecucion de la funcion
  
  	if(!puede_recibir) //si todavia no paso el tiempo asignado,
  	return PLUGIN_HANDLED // tamb paramos la ejecucion
  
  	//seteamos la plata; a lo que ya tiene, le sumamos el valor que indica "cvar_plata"
  	cs_set_user_money(id, cs_get_user_money(id) + get_pcvar_num(cvar_plata))
  
  	//hacemos un task, que se va a activar cuando haya pasado el tiempo especificado
  	//@param 1: tiempo (float) 
    	//@param 2: funcion que se va a activar al pasar ese tiempo
   	//@param 3: id unico del task; lo vamos a usar despues  
     	set_task(get_pcvar_float(cvar_tiempo), "reset", 1234)  
 	return PLUGIN_HANDLED // damos fin a la funcion "darplata"
}

public reset() // al pasar el tiempo definido por cvar_tiempo...
{
  	puede_recibir = true // hacemos true a esta variable para que pueda volver a usar el cmd
}

public client_disconnect(id) //se llama cuando el player se desconecta
{
  	if(task_exists(1234)) //si el task todavia estaba siendo ejecutado cuando se fue...
  	remove_task(1234) //lo borramos
}

public event_muerte() // LA FUNCION QUE ES LLAMADA EN LA MUERTE DE UN USUARIO
{
  	if(task_exists(1234)) // hacemos lo mismo que en client_disconnect (id)
  	remove_task(1234)
  	puede_recibir = true //la hacemos true con el mismo fin que en la funcion reset()
}  

 

Con eso finaliza el tut, espero que les sirva.

Enlace al comentario
Compartir en otros sitios

  • Respuestas 1
  • Creado
  • Última respuesta

Top posteadores en este tema

Días populares

Invitado
Este tema se encuentra cerrado a nuevas respuestas.
  • Navegando Recientemente   0 miembros

    • No hay usuarios registrados viendo esta página
×
×
  • Crear nuevo...