Neeeeeeeeeel.- |
12-12-2012 09:22 |
[Tutorial] Sistema de niveles para ZP 5.0.X
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_level[ MAXPLAYERS + 1 ];
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_putinserver( id ) g_level[ id ] = 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_change( id ) { new lvl = g_level[ id ]; // 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_get( id ) >= cost_levelup( lvl ) ) lvl++; while( zp_ammopacks_get( id ) < cost_levelup( ( lvl - 1 ) ) ) 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_level[ id ] == lvl ) return PLUGIN_HANDLED; // Si el nivel cambio le muestro un mensaje... if( lvl > g_level[ id] ) zp_colored_print( id, "^x01 Subiste al nivel^x04 %d^x01!!!", lvl ); else if( g_level[ id ] > lvl ) zp_colored_print( id, "^x01 Bajaste al nivel^x04 %d^x01!!!", lvl ); //le doy el nivel correspondiente g_level[ id ] = 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_level( plugin_id, num_params ) { new id = get_param( 1 ); new ammount = get_param( 2 ); g_level[ id ] = ammount; return ammount; }
// Y esta es la native para obtener los niveles, es un simple return como se puede ver public native_get_level( plugin_id, num_params ) return g_level[ get_param( 1 ) ];
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_level( id, ammount );
native zp_get_level( id );
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_IGNORE, FP_CELL );
Vamos a donde dice
PHP Code:
public native_ammopacks_set(plugin_id, num_params)
Y le agregamos el ExecuteForward, debería quedar algo así:
PHP Code:
public native_ammopacks_set( plugin_id, num_params ) { new id = get_param( 1 ); if( !is_user_valid( id ) ) { log_error( AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id ); return false; } new amount = get_param( 2 ); g_AmmoPacks[id] = amount; //Esta variable sera utilizara por el forward para obtener el valor retornado por la misma new ret; ExecuteForward( g_ammop_forward, ret, id ); //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_change( id );
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
Abajo de
PHP Code:
#include <zp50_ammopacks>
Buscamos
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "%L: %s^nHP: %d - %L %s - %L %d", ID_SHOWHUD, "SPECTATING", player_name, get_user_health(player), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "AMMO_PACKS1", zp_ammopacks_get(player))
Y lo reemplazamos por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "%L: %s^nHP: %d - %L %s - %L %d - Level: %d", ID_SHOWHUD, "SPECTATING", player_name, get_user_health(player), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "AMMO_PACKS1", zp_ammopacks_get(player), zp_get_level( player ))
Abajo está la linea
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "%L: %s^nHP: %d - %L %s - %L $ %d", ID_SHOWHUD, "SPECTATING", player_name, get_user_health(player), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "MONEY1", cs_get_user_money(player))
Y la cambiamos por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "%L: %s^nHP: %d - %L %s - %L $ %d - Level: %d", ID_SHOWHUD, "SPECTATING", player_name, get_user_health(player), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "MONEY1", cs_get_user_money(player), zp_get_level( player ))
Mas abajo encontramos
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "HP: %d - %L %s - %L %d", get_user_health(ID_SHOWHUD), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "AMMO_PACKS1", zp_ammopacks_get(ID_SHOWHUD))
Y lo modificamos para que quede así
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "HP: %d - %L %s - %L %d - Level: %d", get_user_health(ID_SHOWHUD), ID_SHOWHUD, "CLASS_CLASS", class_name, ID_SHOWHUD, "AMMO_PACKS1", zp_ammopacks_get(ID_SHOWHUD), zp_get_level( ID_SHOWHUD ))
Y para terminar, por último donde dice
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "HP: %d - %L %s", get_user_health(ID_SHOWHUD), ID_SHOWHUD, "CLASS_CLASS", class_name)
Debemos cambiarlo por
PHP Code:
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "HP: %d - %L %s - Level: %d", get_user_health(ID_SHOWHUD), ID_SHOWHUD, "CLASS_CLASS", class_name, zp_get_level( ID_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:D
|