Bueno, quiero aclarar que lo único que hice fue traducir el tutorial creado por
flyeni6, no agregue nada nuevo. Si hay algún error en la traducción por favor avisarme.
Tutorial Original:
http://forums.alliedmods.net/showthread.php?t=66497
Traductor: nattal
Primero que nada, todos los créditos van para fxfighter, el revisó esto. Todo lo que hago es publicar esto asi la gente no va a otro tutorial de xp mod (que no funcione). Y he añadido un poco de extras para que sea mejor. De todas formas, vamos al tutorial...
Voy a mostrarles como pueden hacer para crear un XP mod.
Antes de empezar, debes tener los conocimientos básicos en scripting.
Incluimos todos los modulos importantes:
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
Definimos las clases máximas
Aca hay 5, pero si queres agregar 2 animales mas, como un pájaro o un pez, entonces tienes que poner 7. Pero se trata de 5
PHP Code:
#define MAXCLASSES 5
Creamos la variable que va a tener su clase, xp, y el nivel
PHP Code:
new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
//Estos son para asesinatos especiales
new XP_Kill,XP_Knife,XP_Hs,SaveXP
//Esto es por Nvault. De modo que asi podemos guardar la XP
new g_vault
Esta es la variable "maxclasses" que estábamos hablando. Vas a ver esto en el juego.
PHP Code:
new const CLASSES[MAXCLASSES][] = {
"None",
"Dog",
"Cat",
"Horse",
"Cow"
}
Nota que ahí hay 5 clases. Por eso es que definimos maxclasses a 5.
Ahora creamos los niveles, y cuanta XP necesita para ganar nivel (o subir nivel).
Hay 7 niveles
PHP Code:
new const LEVELS[7] = {
0,
100,//esto significa que necesitas 100 xp
200,//esto significa que necesitas 200 xp
400,//esto significa que necesitas 400 xp
800,//Así sucesivamente
1600,//Así sucesivamente
3200 //Así sucesivamente
}
Ahora creamos el plugin_init()
PHP Code:
public plugin_init()
{
register_plugin("XpMod", "1.0", "Fxfighter")
//necesitamos esto para comprobar el nivel después de matar a alguien
register_event("DeathMsg", "eDeath", "a")
//Se esta salvando?
SaveXP = register_cvar("SaveXP","1")
//cuántos XP vas a conseguir por muerte?
XP_Kill=register_cvar("XP_per_kill", "20")
//Si haces un hs obtenes un bonus en XP
XP_Hs=register_cvar("XP_hs_bonus","20")
//Si matas a alguien con cuchillo obtenes un bonus en XP
XP_Knife=register_cvar("XP_knife_bonus","20")
//acabamos de abrir una nueva conexión NVAULT conexión
// Vamos a llamarlo "animod"
g_vault = nvault_open("animod")
// Registramos un comando por say para cambiar de clase
register_clcmd("say /class", "ChangeClass")
register_clcmd("say_team /class", "ChangeClass")
//Muestra cuanta XP tenes
register_clcmd("say /xp", "ShowHud")
register_clcmd("say_team /xp", "ShowHud")
}
Vamos a crear la función de Muerte. Recuerda que nosotros llamamos "eDeath" en plugin_init ()? Asimismo, mantendrá un registro de su xp y si ganaste (o subiste) de nivel.
PHP Code:
public eDeath( ) //Nombre de la función
{
//Si el player no tiene clase, entonces no te molestes en hacer cualquiera de las siguientes cosas.
if(PlayerClass[attacker] == 0)
return PLUGIN_CONTINUE
// Creamos una variable para almacenar el ID del Atacante
new attacker = read_data( 1 )
// Creamos la variable de la víctima, de modo que esta función puede checkear
// Si un jugador fue asesinado
new iVictim = read_data( 2 )
// Si un player fue asesinado por un HeadShot, este será utilizado por el cvar Xp_Hs
new headshot = read_data( 3 )
//Que arma se uso
new clip, ammo, weapon = get_user_weapon(attacker,clip,ammo);
PlayerXP[attacker] += get_pcvar_num(XP_Kill)
// Usado por el cvar xp_hs
// Chekea si la víctima fue asesinada por un Headshot
if(headshot)
// Le da a el/ella un bonus de XP
PlayerXP[attacker] += get_pcvar_num(XP_Hs)
// Chekea si la víctima fue asesinada por el cuchillo
if(weapon == CSW_KNIFE)
//Le da a el/ella un bonus de XP
PlayerXP[attacker] += get_pcvar_num(XP_Knife)
// Esto chekea si el player tiene el suficiente XP para avanzar a un nivel (superior en este caso)
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
{ // Creamos el mensaje de Felicitaciones por pasar de nivel.
client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
// Agregamos su level
PlayerLevel[attacker] += 1
}
// Muestra su nivel en un mensaje por hud.
ShowHud(attacker)
}
Esta es la función showhud. Muestra tu clase, tu nivel y XP
PHP Code:
{
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]])
}
Aclaración: ^n significa nueva línea.
Aquí está el selector de menús. Te da las opciones para seleccionar su animal. Utiliza el nuevo sistema de menús. No siento que deba entrar en detalles con el nuevo sistema de menús, si te interesa, dejo el link del tutorial de menús:
http://forums.alliedmods.net/showthread.php?t=46364
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
}
Esta es la función de conexión del cliente. Todas esas cosas que suceden cuando un player se conecta al server
PHP Code:
public client_connect(id)
{
// Solo hace esto si esta activado el guardado de XP
if(get_pcvar_num(SaveXP) == 1)
{
// Cargamos la información del player.
LoadData(id)
}
}
Esta es la función de desconexión del cliente. Esto solo sucede cuando el player se desconecta del servidor.
PHP Code:
public client_disconnect(id)
{
// Solo hace esto si esta activado el guardado de XP
if(get_pcvar_num(SaveXP) == 1)
{
// guardamos los datos
SaveData(id)
}
}
Ahora creamos la función para guardar los datos.
PHP Code:
public SaveData(id)
{
// Obtiene el steam ID de los players. Necesitamos esto porque vamos a guardar por Steam ID
new AuthID[35] get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
// Formato de lo que va a estar en el archivo Vault del mod animal
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
// Guardamos la información
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
Ahora creamos la función para cargar los datos.
PHP Code:
public LoadData(id)
{
new AuthID[35] get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
// Busca
format(vaultkey,63,"%s-Mod",AuthID)
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id])
// Carga la información
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
}
Ok, ahora todo pero sin los comentarios
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 attacker = read_data( 1 )
new iVictim = read_data( 2 )
new headshot = read_data( 3 )
new clip, ammo, weapon = get_user_weapon(attacker,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
}
Espero (por más que no es nada nuevo) que a alguien le sirva en español.