Requerimientos: tiener algo de conosimiento en scripting
Paso:
Code:
1. Incluimos los módulos mas importantes
2. Definimos la maxima cantadad de clases
3. Creamos las variables para el nivel , la clase y la xp(experiencia)
4. Aqui usaremos la variable MAXCLASSES para limitar el tamaño de la constante. Esto es lo que tu veras dentro del juego.
5.Ahora creamos los niveles, y cuanta experiencia necesitas para pasar a un nivel
6. Ahora creamos los cvar , abrimos un nvault, registramos comandos y un evento
7. Creamos la funcion de Deathmsg. Recuerda el eDeath en plugin_init()? Es donde pondremos para aumentar de nivel y experiencia
8. Esta es la funcion donde muestra el nivel la experiencia y la clase
9. Creamos el menu
10. Creamos la funcion de guardado
11. Creamos la funcion de cargado
12. Registramo cuando se carga y se guardan los datos
1. Incluimos los módulos mas importantes
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
2. Definimos la maxima cantadad de clases.
Aqui tenemos 5 clase, pero is tu quieres agregar 2 animales mas, tu puedes poner 7 o mas tambien. Pero nosotros lo aremos con 5
PHP Code:
#define MAXCLASSES 5
3. Creamos las variables para el nivel , la clase y la xp(experiencia)
PHP Code:
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
// estas son para detectar las formas en que mato
new XP_Kill,XP_Knife,XP_Hs,SaveXP
//Esta es para nvault, donde guardaremos nustros datos como nivel y mas.
new g_vault
4. Aqui usaremos la variable MAXCLASSES para limitar el tamaño de la constante. Esto es lo que tu veras dentro del juego.
PHP Code:
new const CLASSES[MAXCLASSES][] =
{
"None", // primer animal
"Dog", // segundo animal
"Cat", // tercer animal ....
"Horse",
"Cow"
}
Nota. La cantida de tipos de animales que pongamo tiene que ser igual a la que definimo en la variable MAXCLASSES
5.Ahora creamos los niveles, y cuanta experiencia necesitas para pasar a un nivel
Aqui son 7 niveles
PHP Code:
new const LEVELS[7] =
{
0,
100,//aqui necesitas 100 de experiencia
200,//aqui necesitas 200 de experiencia
400,//aqui necesitas 400 de experiencia...
800,// .....
1600,//....
3200 //.....
}
6. Ahora creamos los cvar , abrimos un nvault, registramos comandos y un evento
PHP Code:
public plugin_init()
{
register_plugin("XpMod", "1.0", "Fxfighter") // Registramos el plugin
// Nesesitamos chequear el evento para cuando alguien muere
// asi registramo las kills y sumamos la experiencia......
register_event("DeathMsg", "eDeath", "a")
// Guardado habilitado?
SaveXP = register_cvar("SaveXP","1")
// Experiencia que gana por matada (kill)
XP_Kill=register_cvar("XP_per_kill", "20")
// Bonus por matar con hs
XP_Hs=register_cvar("XP_hs_bonus","20")
// Bonus por matar con cuchillo
XP_Knife=register_cvar("XP_knife_bonus","20")
//Abripos el nvault para hacer el guarado despues
g_vault = nvault_open("animod")
//registramos el say para cambiar de classe
register_clcmd("say /class", "ChangeClass")
register_clcmd("say_team /class", "ChangeClass")
// registramos el say para ver la experiencia
register_clcmd("say /xp", "ShowHud")
register_clcmd("say_team /xp", "ShowHud")
}
7. Creamos la funcion de Deathmsg. Recuerda el eDeath en plugin_init()? Es donde pondremos para aumentar de nivel y experiencia
PHP Code:
public eDeath( ) //nombre de la funcion
{
// Si el player no tiene ninguna clase no continua
if(PlayerClass[attacker] == 0)
return PLUGIN_CONTINUE
// Creamos la variable de la victima, esto sirve para chekear
// si el player es matado
new iVictim = read_data( 2 )
// Si el player es matado en la cabeza, la usaremos para el cvar Xp_Hs
new headshot = read_data( 3 )
//Registramos el arma que usa
new clip, ammo, weapon = get_user_weapon(id,clip,ammo);
PlayerXP[attacker] += get_pcvar_num(XP_Kill)
// lo usamos para el cvar XP_Hs
// chequeamos si la victima fue matada en la cabeza
if(headshot)
// nos da el bonus correspondiente
PlayerXP[attacker] += get_pcvar_num(XP_Hs)
// chequeamos si la victima fue matada con cuchillo
if(weapon == CSW_KNIFE)
//nos da el bonus correspondiente
PlayerXP[attacker] += get_pcvar_num(XP_Knife)
// aqui chequeamos que si la experencia es mayor a la seteada en la
// variable LEVELS para subir de nivel
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
{
// Aqui creamos un mensaje de felicitaciones por subir de nivel.
client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
// Aderimos un nivel
PlayerLevel[attacker] += 1
}
// Mostramos un mensaje con su nivel
ShowHud(attacker)
}
8. Esta es la funcion donde muestra el nivel la experiencia y la clase
PHP Code:
public ShowHud(id)
{
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
show_hudmessage(id, "Level: %i^nXP: %i^nClass: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
Note: ^n es para hacer una nueva linea (si no entienden consultenmelo)
9. Creamos el menu
Este es el menu donde tendremos opcione spaara elegir la clase de animal nuestra
PHP Code:
public ChangeClass(id)
{
new menu = menu_create("Class Menu" , "Class_Handle");
menu_additem(menu ,"Dog", "1" , 0);
menu_additem(menu ,"Cat", "2" , 0);
menu_additem(menu ,"Horse", "3" , 0);
menu_additem(menu ,"Cow", "4" , 0);
menu_setprop(menu , MPROP_EXIT , MEXIT_ALL);
menu_display(id , menu , 0);
return PLUGIN_CONTINUE;
}
public Class_Handle(id , menu , item)
{
if(item == MENU_EXIT)
menu_destroy(menu);
new szCommand[6] , szName[64]; new access , callback;
menu_item_getinfo(menu , item , access , szCommand , 5 , szName , 63 , callback);
new i = str_to_num(szCommand)
if(PlayerClass[id] != i)
PlayerClass[id] = i client_print(id,print_chat,"You are now a %s",CLASSES[i])
else
client_print(id,print_chat,"You are alredy a %s",CLASSES[i])
menu_destroy(menu);
return PLUGIN_CONTINUE
}
10. Creamos la funcion de guardado
PHP Code:
public SaveData(id)
{
// Tomamos el seteam id del player, lo nocesitamos porque guardaremos los
// datos a travez del steam id
new AuthID[35] get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
// Hacemos estos format para indicar que es lo que se guarda
// en el archivo de la data de nvault
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
// Guardamos la data
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
11. Creamos la funcion de cargado
now we create the load data function
PHP Code:
public LoadData(id)
{
// Tomamos el seteam id de un user porque lo guardamos a travez de el
new AuthID[35] get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
// Buscamos los datos(esto tiene que estar igual a como lo guardamo
// porque si no nunca lo encontrara
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
// Ahora cargamos los adtos
nvault_get(g_vault,vaultkey,vaultdata,255)
replace_all(vaultdata, 255, "#", " ")
new playerxp[32], playerlevel[32]
// Ordenamos las lineas
parse(vaultdata, playerxp, 31, playerlevel, 31)
// Aca seteamos que la xp es igual a la que esta
// dentro del archivo donde lo guardamos
PlayerXP[id] = str_to_num(playerxp)
// Lo mismo que la xp
PlayerLevel[id] = str_to_num(playerlevel)
return PLUGIN_CONTINUE
}
12. Registramo cuando se carga y se guardan los datos
Usamos la funcion client disconected. Esta se activa cuando el user se conecta al sv
PHP Code:
public client_connect(id)
{
// SI la cvar es igual a 1 , es decir,
// si esta habilitado prosigue
if(get_pcvar_num(SaveXP) == 1)
{
// Llamamos a la funcion que carga la data
LoadData(id)
}
}
Esta es la funciondclient disconect. Esta se activa cuando un player se desconecta del servidor
PHP Code:
public client_disconnect(id)
{
// Si esta habilitdao prosigue
if(get_pcvar_num(SaveXP) == 1)
{
// Llamamos a la funcoin que guarda la adta
SaveData(id)
}
}
Bueno hemos terminado , ahora solo queda que comenten
Aqui tienen el codigo completo
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#define MAXCLASSES 5
new const CLASSES[MAXCLASSES][] = {
"None",
"Dog",
"Cat",
"Horse",
"Cow"
}
new const LEVELS[6] = {
100,
200,
400,
800,
1600,
3200
}
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
new XP_Kill,XP_Knife,XP_Hs,SaveXP,g_vault
public plugin_init()
{
register_plugin("XpMod", "1.0", "Fxfighter")
register_event("DeathMsg", "eDeath", "a")
SaveXP = register_cvar("SaveXP","1")
XP_Kill=register_cvar("XP_per_kill", "20")
XP_Hs=register_cvar("XP_hs_bonus","20")
XP_Knife=register_cvar("XP_knife_bonus","20")
g_vault = nvault_open("animod")
register_clcmd("say /class", "ChangeClass")
register_clcmd("say_team /class", "ChangeClass")
register_clcmd("say /xp", "ShowHud")
register_clcmd("say_team /xp", "ShowHud")
}
public eDeath( )
{
new iVictim = read_data( 2 )
new headshot = read_data( 3 )
new clip, ammo, weapon = get_user_weapon(id,clip,ammo);
PlayerXP[attacker] += get_pcvar_num(XP_Kill)
if(headshot)
PlayerXP[attacker] += get_pcvar_num(XP_Hs)
if(weapon == CSW_KNIFE)
PlayerXP[attacker] += get_pcvar_num(XP_Knife)
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
{
client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!",
PlayerLevel[attacker] += 1
}
ShowHud(attacker)
SaveData(attacker)
}
public ShowHud(id)
{
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0)
show_hudmessage(id, "Level: %i^nXP: %i^nClass: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])
}
public ChangeClass(id)
{
new menu = menu_create("Class Menu" , "Class_Handle");
menu_additem(menu ,"Dog", "1" , 0);
menu_additem(menu ,"Cat", "2" , 0);
menu_additem(menu ,"Horse", "3" , 0);
menu_additem(menu ,"Cow", "4" , 0);
menu_setprop(menu , MPROP_EXIT , MEXIT_ALL);
menu_display(id , menu , 0);
return PLUGIN_CONTINUE;
}
public Class_Handle(id , menu , item)
{
if(item == MENU_EXIT) menu_destroy(menu);
new szCommand[6] , szName[64];
new access , callback;
menu_item_getinfo(menu , item , access , szCommand , 5 , szName , 63 , callback);
new i = str_to_num(szCommand)
if(PlayerClass[id] != i)
{
PlayerClass[id] = i
client_print(id,print_chat,"You are now a %s",CLASSES[i])
}
else
client_print(id,print_chat,"You are alredy a %s",CLASSES[i])
menu_destroy(menu);
return PLUGIN_CONTINUE
}
public client_connect(id)
{
if(get_pcvar_num(SaveXP) == 1)
LoadData(id)
}
public client_disconnect(id)
{
if(get_pcvar_num(SaveXP) == 1)
SaveData(id)
PlayerXP[id] = 0
PlayerLevel[id] = 0
PlayerClass[id] = 0
}
public SaveData(id)
{
new AuthID[35]
get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
public LoadData(id)
{
new AuthID[35]
get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
nvault_get(g_vault,vaultkey,vaultdata,255)
replace_all(vaultdata, 255, "#", " ")
new playerxp[32], playerlevel[32]
parse(vaultdata, playerxp, 31, playerlevel, 31)
PlayerXP[id] = str_to_num(playerxp)
PlayerLevel[id] = str_to_num(playerlevel)
return PLUGIN_CONTINUE
}
Tutorial echo por "flyeni6"
Traduccion al español por "Darckbaston"
Espero que les guste , y les ayude!
PD: Es lo mejor que pude traducir, si esta algo mal diganmelo plis
__________________