Senior Member
Join Date: Jun 2006
Location: CAli
|
02-01-2008
, 17:16
New XP Mod tutorial
|
#1
|
First of all, full credit goes to fxfighter, he revised it. All im doing is releasing this so that people wont go to the other xp mod tutorial (which doesnt work). And i added a little bit of extras so that it would be better. Anyways, on to the tutorial ...
Im going to show you have to make an XP mod.
Before starting, you should have basic scripting Knowledge.
Inculde all the important modules
PHP Code:
#include <amxmodx> #include <amxmisc> #include <nvault>
Define the maximum classes.
Here there is 5, but if you want to add 2 more animals, like a bird and a fish, then you can put 7. But we are dealing with 5
PHP Code:
#define MAXCLASSES 5
We create the variable that is going to hold your class, xp , and level
PHP Code:
new PlayerXP[33],PlayerLevel[33],PlayerClass[33] //these are for special kills new XP_Kill,XP_Knife,XP_Hs,SaveXP //this is for Nvault. so that We can save XP new g_vault
This is the "maxclasses" variable we were talking about. You'll see these in the game.
Code:
PHP Code:
new const CLASSES[MAXCLASSES][] = { "None", "Dog", "Cat", "Horse", "Cow" }
Note that there are 5 classes. Thats why we defined maxclasses to 5
Now we create the levels, and how many xp you ned to gain a level.
There is 7 levels
Code:
PHP Code:
new const LEVELS[7] = { 0, 100,//this means you need 100 xp 200,//this means you need 200 xp 400,//this means you need 400 xp 800,//so on 1600,//so on 3200 //so on }
Now we create the plugin_init()
PHP Code:
public plugin_init() { register_plugin("XpMod", "1.0", "Fxfighter") //we need this to check your level after you kill some one register_event("DeathMsg", "eDeath", "a") //is saving on? SaveXP = register_cvar("SaveXP","1") //how many xp are u gonna get per kill? XP_Kill=register_cvar("XP_per_kill", "20") //if you get a hs you get bonus xp XP_Hs=register_cvar("XP_hs_bonus","20") //if you make a knife kill you get bounus xp XP_Knife=register_cvar("XP_knife_bonus","20") //we just opened a new connection NVAULT connection // we will call it animod g_vault = nvault_open("animod") // register a say command to change class register_clcmd("say /class", "ChangeClass") register_clcmd("say_team /class", "ChangeClass") //show how much xp you have register_clcmd("say /xp", "ShowHud") register_clcmd("say_team /xp", "ShowHud") }
We are gonna create the Death function. Rember we called it "eDeath" in plugin_init()? It will keep track of your xp and if you ganined a level
Code:
PHP Code:
public eDeath( ) //function name { // If the player's Class is nothing, then dont bother to do any of the below if(PlayerClass[attacker] == 0) return PLUGIN_CONTINUE
// Create a variable to store the attacker's id new attacker = read_data( 1 ) // We create the victim variable, so that this function can check // if a player was killed new iVictim = read_data( 2 ) // If a player was killed by a HeadShot, this will be used for the cvar Xp_Hs new headshot = read_data( 3 ) //which weapon was used new clip, ammo, weapon = get_user_weapon(attacker,clip,ammo); PlayerXP[attacker] += get_pcvar_num(XP_Kill) // used for the xp_hs cvar // it checks if the victim was killed by a headshot if(headshot) // give him/her bonus xp PlayerXP[attacker] += get_pcvar_num(XP_Hs) // checks if the victim was killed by a knife if(weapon == CSW_KNIFE) //give him/her bonus xp PlayerXP[attacker] += get_pcvar_num(XP_Knife) // this checks if the player has enough xp to advance to a new level while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]]) { // this will create the Congratulations message. client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]]) // Add his/her level PlayerLevel[attacker] += 1 } // shows his level on a hud message ShowHud(attacker) }
This is the showhud function. It shows the your Class, your level, and XP
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 means new line
Here is the menu selector. It will give you the options to select your animal. It uses the new menu system. I dont feel like going into detail with the new menu system, here is the original tutorial on that
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 }
This this is the client connect function. All these things happend when the player is connecting to the server
PHP Code:
public client_connect(id) { // Only does it if xp saving is on if(get_pcvar_num(SaveXP) == 1) { // load your player data LoadData(id) } }
This is the client disconect funtion. These only happen when the player has disconnected from the server
PHP Code:
public client_disconnect(id) { // Only does it if xp saving is on if(get_pcvar_num(SaveXP) == 1) { // lets save the data SaveData(id) } }
Now we create the save data function
PHP Code:
public SaveData(id) { // get the players steam id. We need this because we are saving by steam id new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] // format wat is going to be in the animal mod vault file format(vaultkey,63,"%s-Mod",AuthID) format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id]) // save the data nvault_set(g_vault,vaultkey,vaultdata) return PLUGIN_CONTINUE }
now we create the load data function
PHP Code:
public LoadData(id) { new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] // search format(vaultkey,63,"%s-Mod",AuthID) format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id]) // load the data 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 now everything with out comments
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
}
Any errors or anything please feel free to reply
__________________
Last edited by Emp`; 01-05-2012 at 14:38.
Reason: fixed errors in eDeath
|
|