Raised This Month: $12 Target: $400
 3% 

[Tutorial] Sistema de niveles para ZP 5.0.X


  
 
 
Thread Tools Display Modes
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.-
LeeanAndNeka
Senior Member
Join Date: Feb 2012
Location: Argentina ♥
Old 12-12-2012 , 09:39   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#2

Muy bueno nelson, tenias razon cuando me dijiste que era un quilombo y habia que estudiarlo
LeeanAndNeka is offline
Send a message via MSN to LeeanAndNeka Send a message via Skype™ to LeeanAndNeka
GalaxyA
BANNED
Join Date: Sep 2012
Location: Noob Member
Old 12-12-2012 , 09:58   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#3

Podrias postearlo en el ZP Forum por que aca pocos usan ZP 5.0, Gracias Neeeeeeeeeeeeeeeel igual como siempre C:
GalaxyA is offline
Send a message via MSN to GalaxyA
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 12-12-2012 , 10:11   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#4

Quote:
Originally Posted by GalaxyA View Post
Podrias postearlo en el ZP Forum por que aca pocos usan ZP 5.0, Gracias Neeeeeeeeeeeeeeeel igual como siempre C:
Me da paja escribirlo en inglés...
Quote:
Originally Posted by LeeanAndNeka View Post
Muy bueno nelson, tenias razon cuando me dijiste que era un quilombo y habia que estudiarlo
Había que sentarse un ratito a leer nada del otro mundo, pero si es un poquito rebuscado.
__________________
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-
XINLEI
me too
Join Date: Jun 2011
Location: Colombian Coffee storage
Old 12-12-2012 , 12:58   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#5

Yo uso 5.0, no es tan complicado. pero vi unas cosas:

-No es mejor llamar solo ese include que usar 3 variables globales y llamar Executeforward 9 veces?
-No vi que llamaras zp_set_level en ningun momento.

Last edited by XINLEI; 12-12-2012 at 12:59.
XINLEI is offline
r0ma
Senior Member
Join Date: Apr 2012
Location: Great Tomb of Nazarick
Old 12-12-2012 , 14:34   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#6

PHP Code:
 // Si el nivel cambio se lo seteo y luego le muestro un mensaje...
    
g_levelid ] = lvl;

    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 ); 
__________________
Discord:FluffyDeveloper#4753
Github: https://github.com/francoromaniello
AMX-ES: https://amxmodx-es.com/r0ma'

Last edited by r0ma; 12-12-2012 at 15:59.
r0ma is offline
Send a message via MSN to r0ma
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 12-12-2012 , 14:55   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#7

zp 5.0.x para mi es horrible su estructura no tenía por qué separarlo en tantos plugins xD (No he visto el código)
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).

gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 12-12-2012 , 18:25   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#8

Quote:
Originally Posted by XINLEI View Post
Yo uso 5.0, no es tan complicado. pero vi unas cosas:

-No es mejor llamar solo ese include que usar 3 variables globales y llamar Executeforward 9 veces?
-No vi que llamaras zp_set_level en ningun momento.
No entendí bien a lo que te referías con el primer punto, pero lo que estube pensando es en poner el forward adentro de la native zp_ammopacks_set y solo tendría que ponerla una vez...

En cuanto al segundo, lo dejé ahí para que los que usen algún guardado puedan cargar los datos con esa native, no se usó en el tuto.

Quote:
Originally Posted by gladius View Post
zp 5.0.x para mi es horrible su estructura no tenía por qué separarlo en tantos plugins xD (No he visto el código)
Amí me gustó porque ahora no tengo que recompilar todo el código para modificar una cosita...

Quote:
Originally Posted by r0ma View Post
PHP Code:
 // Si el nivel cambio se lo seteo y luego le muestro un mensaje...
    
g_levelid ] = lvl;

    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 ); 
Jajaja ahí lo arreglo xD
__________________

Last edited by Neeeeeeeeeel.-; 12-12-2012 at 18:27.
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-
XINLEI
me too
Join Date: Jun 2011
Location: Colombian Coffee storage
Old 12-12-2012 , 20:38   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#9

Quote:
Originally Posted by Neeeeeeeeeel.- View Post
No entendí bien a lo que te referías con el primer punto, pero lo que estube pensando es en poner el forward adentro de la native zp_ammopacks_set y solo tendría que ponerla una vez...
Despues de ver el codigo de nuevo no creo que necesites hacer una forward, ya que uno es quien decide como quiere que la gente suba de nivel. Ahora estas forzando los niveles con AP y no deberia ser asi, para eso lo haces directamente en el source con 2 natives mas de get y set.
XINLEI is offline
Neeeeeeeeeel.-
Some Guy Yellin'
Join Date: Jul 2010
Location: Argentina
Old 12-12-2012 , 21:00   Re: [Tutorial] Sistema de niveles para ZP 5.0.X
#10

Quote:
Originally Posted by XINLEI View Post
Despues de ver el codigo de nuevo no creo que necesites hacer una forward, ya que uno es quien decide como quiere que la gente suba de nivel. Ahora estas forzando los niveles con AP y no deberia ser asi, para eso lo haces directamente en el source con 2 natives mas de get y set.
Bueno en este caso yo decidí que sea por ammopacks y usé un forward.
__________________
Neeeeeeeeeel.- is offline
Send a message via Skype™ to Neeeeeeeeeel.-
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 09:18.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode