View Single Post
Author Message
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 12-12-2012 , 09:22   [Tutorial] Sistema de niveles para ZP 5.0.X
#1

Bueno les voy a explicar una de las formas de crear niveles para ZP 5.0

Yo usé la versión ZP 5.0.8 pero sirve para 5.0.X

Lo primero que hay que hacer es crear un plugin con el nombre zp50_levels

PHP Code:
/*================================================================================
    
    --------------------------------
    -*- [ZP] Level system -*-
    --------------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include < amxmodx >
#include < zp50_ammopacks >
#include < zp50_colorchat >

#define MAXPLAYERS 32

// Este macro lo utilizaremos para calcular los ammopacks necesarios del siguiente nivel
// PD: power quiere decir potencia, en este caso se esta haciendo los niveles ingresados al cuadrado
// PD2: Esta ecuacion puede ser modificada a gusto de cada uno, esto seria la "dificultad" si se la quiere llamar asi
#define cost_levelup(%1)    (13 * %1) + ((11 * power(%1, 2)) / 2)

// Creamos una variable global para guardar los niveles de cada jugador
new g_levelMAXPLAYERS ];

public 
plugin_init( )
    
register_plugin"[ZP] Level system"ZP_VERSION_STRING"ZP Dev Team" );

public 
plugin_natives( )
{
    
// Bueno aca registramos las natives que luego utilizaremos en los demas plugins
    
register_native"zp_set_level""native_set_level" );
    
register_native"zp_get_level""native_get_level" );
}

// Hacemos que el nivel del jugador sea 1 cuando se conecta, en este lugar ustedes deberian cargar los niveles (pueden hacerlo en un plugin externo)
public client_putinserverid )
    
g_levelid ] = 1;

// Esta funcion es la forward que se llamara cada vez que se sumen o resten ammopacks, se vera mas en detalle luego
public zp_fw_ammopacks_changeid )
{
    new 
lvl g_levelid ];
    
    
// Aca lo que hago es verificar si tiene mas ammopacks de los necesarios para el siguiente nivel, se utiliza un while por si es necesario subir/bajar mas de 1 nivel al mismo tiempo.
    
while(  zp_ammopacks_getid ) >= cost_leveluplvl )  )
        
lvl++;
        
    while( 
zp_ammopacks_getid ) < cost_levelup( ( lvl ) ) )
        
lvl--;
    
    
// Esto lo hago mas que nada para no sobrecargar el guardado de datos, yo al final de esta forward llamo a la funcion que actualiza los datos, y la mayoria de las veces que se llama esta forward, el nivel no cambia
    
if( g_levelid ] == lvl )
        return 
PLUGIN_HANDLED;
    
    
// Si el nivel cambio le muestro un mensaje...
    
if( lvl g_levelid] )
        
zp_colored_printid"^x01 Subiste al nivel^x04 %d^x01!!!"lvl );
    else if( 
g_levelid ] > lvl )
        
zp_colored_printid"^x01 Bajaste al nivel^x04 %d^x01!!!"lvl );
    
//le doy el nivel correspondiente
    
g_levelid ] = lvl;

    return 
PLUGIN_HANDLED;
}

// Esta es la native para setiar los niveles, esta hecha un poco diferente a las convencionales, lo hice asi para respetar la forma en que se crearon las demas nativez en esta version de ZP
// En vez de poner los parametros al lado del nombre de la funcion, se cargan en una variable con get_param, no se la diferencia con las natives convencionales
public native_set_levelplugin_idnum_params )
{
    new 
id get_param);
    new 
ammount get_param);
    
    
g_levelid ] = ammount;
    
    return 
ammount;
}

// Y esta es la native para obtener los niveles, es un simple return como se puede ver
public native_get_levelplugin_idnum_params )
    return 
g_levelget_param) ]; 
Una vez hecho esto hay que crear el include con el nombre zp50_niveles.inc
No hace falta mucha explicación en este paso...
PHP Code:
#if defined _zp50_levels_included
  #endinput
#endif
#define _zp50_levels_included

native zp_set_levelidammount );

native zp_get_levelid ); 
Bueno y ahora viene cuando tenemos que definir la forward zp_fw_ammopacks_change, lo que hay que hacer es ejecutar la forward en la native zp_ammopacks_set que son los momentos que los ammopacks cambian...

Abrimos el plugin zp50_ammopacks.sma

Creamos una variable global con el nombre g_ammop_forward

Luego dentro de plugin_init colocamos:
PHP Code:
//El primer parametro es el nombre de la forward
//El segundo parametro vendria a ser como se tomara el valor retornado por la forward, como a nosotros no nos interesa utilizamos ET_IGNORE
//Y los parametros que siguen son los parametros de la forward, nosotros solo necesitamos el index del jugador al que le suben/bajan los ammopacks y como es un numero entero usamos FP_CELL
g_ammop_forward CreateMultiForward"zp_fw_ammopacks_change"ET_IGNOREFP_CELL ); 
Vamos a donde dice
PHP Code:
public native_ammopacks_set(plugin_idnum_params
Y le agregamos el ExecuteForward, debería quedar algo así:
PHP Code:
public native_ammopacks_setplugin_idnum_params )
{
    new 
id get_param);
    
    if( !
is_user_validid ) )
    {
        
log_errorAMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id );
        return 
false;
    }
    
    new 
amount get_param);
    
    
g_AmmoPacks[id] = amount;
    
    
//Esta variable sera utilizara por el forward para obtener el valor retornado por la misma
    
new ret;
    
ExecuteForwardg_ammop_forwardretid ); //Esto ejecuta la forward con id como parametro
    
    
return true;

Bueno finalmente lo que hay que hacer es abrir el include zp50_ammopacks.inc y agregar
PHP Code:
forward zp_fw_ammopacks_changeid ); 
Y ahora lo único que falta es mostrar los niveles en el hud, así que abrimos zp50_hud_info.sma

Tenemos que agregar el include de niveles, entonces ponemos
PHP Code:
#include < zp50_levels > 
Abajo de
PHP Code:
#include <zp50_ammopacks> 
Buscamos
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"%L: %s^nHP: %d - %L %s - %L %d"ID_SHOWHUD"SPECTATING"player_nameget_user_health(player), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"AMMO_PACKS1"zp_ammopacks_get(player)) 
Y lo reemplazamos por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"%L: %s^nHP: %d - %L %s - %L %d - Level: %d"ID_SHOWHUD"SPECTATING"player_nameget_user_health(player), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"AMMO_PACKS1"zp_ammopacks_get(player), zp_get_levelplayer )) 
Abajo está la linea
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"%L: %s^nHP: %d - %L %s - %L $ %d"ID_SHOWHUD"SPECTATING"player_nameget_user_health(player), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"MONEY1"cs_get_user_money(player)) 
Y la cambiamos por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"%L: %s^nHP: %d - %L %s - %L $ %d - Level: %d"ID_SHOWHUD"SPECTATING"player_nameget_user_health(player), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"MONEY1"cs_get_user_money(player), zp_get_levelplayer )) 
Mas abajo encontramos
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"HP: %d - %L %s - %L %d"get_user_health(ID_SHOWHUD), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"AMMO_PACKS1"zp_ammopacks_get(ID_SHOWHUD)) 
Y lo modificamos para que quede así
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"HP: %d - %L %s - %L %d - Level: %d"get_user_health(ID_SHOWHUD), ID_SHOWHUD"CLASS_CLASS"class_nameID_SHOWHUD"AMMO_PACKS1"zp_ammopacks_get(ID_SHOWHUD), zp_get_levelID_SHOWHUD )) 
Y para terminar, por último donde dice
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"HP: %d - %L %s"get_user_health(ID_SHOWHUD), ID_SHOWHUD"CLASS_CLASS"class_name
Debemos cambiarlo por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUDg_MsgSync"HP: %d - %L %s - Level: %d"get_user_health(ID_SHOWHUD), ID_SHOWHUD"CLASS_CLASS"class_namezp_get_levelID_SHOWHUD )) 
Ahora, compilamos todo y listo ZP 5.0.X con niveles.
PD: No se olviden de agregar zp50_levels.amxx en la lista de plugins (estube casi una hora putiando las natives hasta que me di cuenta que no habia cargado el plugin)

Espero que les sirva
__________________

Last edited by Neeeeeeeeeel.-; 12-16-2012 at 23:38.
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-