04/09/2014, 05:06 PM
(Última modificación: 04/09/2014, 08:44 PM por Evil Spiret.)
Hola chicos estoy usando un sistema de clases en "mi" HNS y bueno, les vengo a dejar una guía para que puedan tener clases en su MOD ; esto es adaptable a todo...
Lo extraje de un deathrun de pozejk y muy facil mente lo adapte al HNS
Bueno ; me puse las pilas y explique casi casi todo. ya es un TUTO
Aviso: Este sistema es por lvls ; es decir te pide niveles para poder elegir las clases
Comencemos
Vamos a usar el
Cuando estaba explicando me di cuenta de que me olvide de las variables
Abajo de los includes
Debajo de los includes ponemos
En fw_playerspawn
En PutinServer
y al final del code
y si quieren abrir el menu mediante un comando...
en plugin_init
Bueno , si falta algo avisen... no lo testie del todo, ando sin tiempo.
PD ; Cuando pueda le agrego la gravedad, la velocidad y daño... pero no es nada complicado asi que...
SALUDOS
Lo extraje de un deathrun de pozejk y muy facil mente lo adapte al HNS
Bueno ; me puse las pilas y explique casi casi todo. ya es un TUTO
Aviso: Este sistema es por lvls ; es decir te pide niveles para poder elegir las clases
Comencemos
Vamos a usar el
Código PHP:
#include <fun>
Cuando estaba explicando me di cuenta de que me olvide de las variables
Código PHP:
new g_class[ 33 ]; // Hacemos una variable que contenga las clases
new g_next_class[ 33 ]; // Esta variable es para cuando elige una clase
Abajo de los includes
Código PHP:
const Keys = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9); // Definimos esto para usar en el menu
Debajo de los includes ponemos
Código PHP:
enum // Hacemos una enumeracion para lo siguiente
{
CLASE_NVL = 0, // Definimos su valor en 0
CLASE_VIDA,
CLASE_ARMOR
// Aca se pueden definir muchas cosas mas por ejemplo la gravedad, velocidad , danio, etc ; Siempre recuerden que el ultimo va sin la ","
}
new g_clases_name[][] = // Aca contenemos todos los nombres de las clases
{
"Iniciado",
"Experto",
"Avanzado",
"Elite",
"Ninja",
"Mafioso" // Recuerden que el ultimo va sin la ","
// Para agregar una clase tienen que poner un nombre y despues setearle el LVL , VIDA y CHALECO.
}
new const g_clases[][] = // Esta constante contiene los datos para las enumeraciones
{
{ 0, 7, 15, 30, 35, 40 }, // Aca definimos NIVEL para cada clase
{ 100, 125, 150, 175, 350, 375 }, // Aca definimos VIDA para cada clase
{ 0, 100, 125, 150, 175, 200 } // Aca definimos CHALECO para cada clase
}
En fw_playerspawn
Código PHP:
if (g_next_class[id] != -1)
{
g_class[id] = g_next_class[id]
g_next_class[id] = -1
}
set_user_armor( id, get_user_armor( id ) + g_clases[CLASE_ARMOR][g_class[ id ]] ) // Aca decimos que el chaleco se va a definir mediante una enumeracion , en este caso CLASE ARMOR
set_user_health( id, get_user_health( id ) + g_clases[CLASE_VIDA][g_class[ id ]] - 100 ) // Aca decimos que la vida se va a definir mediante otra enum, en este caso CLASE_VIDA
// Para el que no entiende por que le ponemos g_clases adelante en todas las enums que uso ; es por que g_clases es la constante que contiene los datos de los lvl , vida , etc
}
En PutinServer
Código PHP:
g_class[plr] = 0 // Decimos que cuando entra al server no tendrá clases elegidas
g_next_class[plr] = -1 // plr es el index, lo cambian por el que tengan ustedes
y al final del code
Código PHP:
public show_clases(id, page) // Hacemos un public para el menu que mostramos
{
static szText[ 350 ], szNum[ 4 ]
// Le damos celdas para los caracteres del menu
new menu = menu_create( "\wClases Sistem: ^n\dSeleccione su clase", "clases_handle")
// Creamos el menu en la variable "menu" con un titulo
for (new i = 0; i < sizeof(g_clases_name); i++)
{
num_to_str(i+1, szNum, 3)
if (g_nivel[ id ] >= g_clases[ CLASE_NVL ][ i ]) // Si es mayor o igual al nivel , se puede elegir la clase
{
if (g_class[id] == i) // Creo que esto es obvio
formatex(szText, 554, "\d%s \y[ EQUIPADO ]", g_clases_name[ i ]) // Si ya eligió clase , le ponemos EQUIPADO mediante la variable g_clases_name
// entre corchetes la "i" , por lo que definimos arriba
else if (i == g_next_class[ id ]) // Aca pasa lo mismo
formatex(szText, 554, "\w%s \d[ POR EQUIPARSE ]", g_clases_name[ i ]) // Esto es cuando elige la clase y esta por elegirse en la próxima ronda
else if (i > g_class[ id ])
formatex(szText, 554, "\w%s \y[ NUEVO ]", g_clases_name[ i ])// Si desbloquea la clase de ponemos esto
else
formatex(szText, 554, "\w%s ", g_clases_name[ i ] )
}
else
formatex(szText, 554, "\d%s \r[ BLOQUEADO ]", g_clases_name[ i ], g_clases[ CLASE_NVL ][ i ]) // Cuando no tiene el nivel suficiente mediante "g_clases[ CLASE_NVL ]"
menu_additem(menu, szText, szNum)
}
menu_setprop( menu, MPROP_BACKNAME, "Anterior" )
menu_setprop( menu, MPROP_NEXTNAME, "Siguiente^n" )
menu_setprop( menu, MPROP_EXITNAME, "\yAtras" )
menu_display(id, menu, page)
}
public clases_handle(id, Menu, item)
{
static iName[ 200 ], iAccess, iData[ 4 ], iCallback, key
menu_item_getinfo( Menu, item, iAccess, iData, 3, iName, 199, iCallback)
key = str_to_num( iData )-1 // Esto lo usaremos mas abajo
if (g_nivel[ id ] >= g_clases[ CLASE_NVL ][ key ]) // Si el lvl es mayor o igual se puede elegir la clase
{
// Todos los hns_print lo pueden cambiar por CHATCOLOR o client_print, recuerden que para usar el chatcolor deben agregar el include
hns_print(id, " !yTu proxima clase sera !g%s", g_clases_name[key]) // Mandamos un mensaje con el nombre de su siguiente clase mediante "g_clases_name"
hns_print(id, " !yVida !g%d !yChaleco !g%d", g_clases[CLASE_VIDA][key], g_clases[CLASE_ARMOR][key])// Le mandamos un mensaje dando info de los stats de las clases mediante "g_clases[CLASE_VIDA] y g_clases[CLASE_ARMOR]"
g_next_class[ id ] = key // Esto se entiende
if ( str_to_num( iData ) <= 7 ) // Aca lo usamos...
show_clases( id, 0 ) // Si no pudo elegir la clase , se abre el menu
else if ( str_to_num( iData ) > 28 )
show_clases( id, 4 )
else if ( str_to_num( iData ) > 21 )
show_clases( id, 3 )
else if ( str_to_num( iData ) > 14 )
show_clases( id, 2 )
else if ( str_to_num( iData ) > 7 )
show_clases( id, 1 )
return PLUGIN_HANDLED
}
else
{
hns_print(id, "yNesesitas ser nivel !g%d !ypara esta clase", g_clases[ CLASE_NVL ][ key ]) // Mandamos mensaje cuando no tiene niveles suficiente para elgir mediante "g_clases[ CLASE_NVL ]"
if ( str_to_num( iData ) <= 7 )
show_clases( id, 0 )
else if ( str_to_num( iData ) > 28 )
show_clases( id, 4 )
else if ( str_to_num( iData ) > 21 )
show_clases( id, 3 )
else if ( str_to_num( iData ) > 14 )
show_clases( id, 2 )
else if ( str_to_num( iData ) > 7 )
show_clases( id, 1 )
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
y si quieren abrir el menu mediante un comando...
en plugin_init
Código PHP:
register_clcmd( "say /class", "show_clases" ); // Decimos que al poner /class se abre el menu , mediante "SHOW_CLASES" que es public del menu
register_clcmd("say_team /class", "show_clases"); // Aca hacemos que si el usuario toca la letra "U" en ves de "Y" y escriba /class , el menu tambien se abre
Bueno , si falta algo avisen... no lo testie del todo, ando sin tiempo.
PD ; Cuando pueda le agrego la gravedad, la velocidad y daño... pero no es nada complicado asi que...
SALUDOS