Raised This Month: $12 Target: $400
 3% 

New XP Mod tutorial


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
flyeni6
Senior Member
Join Date: Jun 2006
Location: CAli
Old 02-01-2008 , 17:16   New XP Mod tutorial
Reply With Quote #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)
    
// We create the victim variable, so that this function can check 
    // if a player was killed 
    
new iVictim read_data)
    
// If a player was killed by a HeadShot, this will be used for the cvar Xp_Hs
    
new headshot read_data)
 
    
//which weapon was used
    
new clipammoweapon 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(attackerprint_chat"[Animal Mod] Congratulations! You are a level %i %s!"PlayerLevel[attacker],CLASSES[PlayerClass[attacker]]) 
        
// Add his/her level 
        
PlayerLevel[attacker] += 
    

    
// 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(255000.750.0106.015.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 szName 63 callback); 
    new 
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[35get_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[35get_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(vaultdata255"#"" "
    new 
playerxp[32], playerlevel[32
    
parse(vaultdataplayerxp31playerlevel31
    
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
flyeni6 is offline
Send a message via AIM to flyeni6
Exolent[jNr]
Veteran Member
Join Date: Feb 2007
Location: Tennessee
Old 02-01-2008 , 19:29   Re: New XP Mod tutorial
Reply With Quote #2

i read a little part, and your knife and hs pcvars are swapped :S
__________________
No private work or selling mods.
Quote:
Originally Posted by xPaw View Post
I love you exolent!
Exolent[jNr] is offline
flyeni6
Senior Member
Join Date: Jun 2006
Location: CAli
Old 02-01-2008 , 20:00   Re: New XP Mod tutorial
Reply With Quote #3

everything fixed thanks
__________________

flyeni6 is offline
Send a message via AIM to flyeni6
[kirk]./musick`
Senior Member
Join Date: Jun 2007
Location: Tampa, Florida
Old 02-01-2008 , 20:41   Re: New XP Mod tutorial
Reply With Quote #4

Looks good, thanks a lot. The other one didn't work, so many people complained
__________________
[kirk]./musick` is offline
Send a message via AIM to [kirk]./musick`
flyeni6
Senior Member
Join Date: Jun 2006
Location: CAli
Old 02-01-2008 , 21:10   Re: New XP Mod tutorial
Reply With Quote #5

Yeh many people were complaining so i was like "damn ill just make a New one"
__________________

flyeni6 is offline
Send a message via AIM to flyeni6
Drak
Veteran Member
Join Date: Jul 2005
Old 02-02-2008 , 00:52   Re: New XP Mod tutorial
Reply With Quote #6

You might want to change "client_connect" to "client_authorized".
Just to be safe.
__________________
Oh yeah
Drak is offline
Send a message via MSN to Drak
fxfighter
Veteran Member
Join Date: Feb 2007
Location: Trollhättan
Old 02-02-2008 , 05:10   Re: New XP Mod tutorial
Reply With Quote #7

think you shuld add this to the death event so you cant get xp whit class none.
PHP Code:
if(PlayerClass[attacker] == 0)
  return 
PLUGIN_CONTINUE 
And plz remove my old mistake^^
PHP Code:
public client_connect(id
{
// cant print he is not in yet
client_print(idprint_chat"[AnimalMod] XP Loaded!"

small future i wuld like to see^^ but it might get buged on max lv.
PHP Code:
show_hudmessage(id"Level: %i^nXP: %i/%i^nClass: %s",PlayerLevel[id],PlayerXP[id],LEVELS[PlayerLevel[id]],CLASSES[PlayerClass[id]]) 
if you get to much xp then you will have a bug that you lv up once instead of twice this will solve it.
PHP Code:
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
PlayerLevel[attacker] += 
__________________
If one of my plugins become broken, contact me by mail. [email protected]

Last edited by fxfighter; 02-02-2008 at 05:48.
fxfighter is offline
Send a message via MSN to fxfighter
flyeni6
Senior Member
Join Date: Jun 2006
Location: CAli
Old 02-02-2008 , 05:51   Re: New XP Mod tutorial
Reply With Quote #8

Quote:
Originally Posted by fxfighter View Post
think you shuld add this to the death event so you cant get xp whit class none.
PHP Code:
if(PlayerClass[attacker] == 0)
  return 
PLUGIN_CONTINUE 
And plz remove my old mistake^^
PHP Code:
public client_connect(id
{
// cant print he is not in yet
client_print(idprint_chat"[AnimalMod] XP Loaded!"

small future i wuld like to see^^ but it might get buged on max lv.
PHP Code:
show_hudmessage(id"Level: %i^nXP: %i/%i^nClass: %s",PlayerLevel[id],PlayerXP[id],LEVELS[PlayerLevel[id]],CLASSES[PlayerClass[id]]) 
if you get to much xp then you will have a bug that you lv up once instead of twice this will solve it.
PHP Code:
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
PlayerLevel[attacker] += 

I did everything but the 3rd part because im very sleepy and i have to do other things. And u said it might bug, so yea.
__________________

flyeni6 is offline
Send a message via AIM to flyeni6
Arkshine
AMX Mod X Plugin Approver
Join Date: Oct 2005
Old 02-02-2008 , 06:00   Re: New XP Mod tutorial
Reply With Quote #9

@flyen16

Can you tell me why are you using get_user_attacker() ?

Code:
public eDeath( ) {     new iVictim = read_data( 2 )     new weapon, hitplace, attacker = get_user_attacker(iVictim,weapon,hitplace)     if(hitplace == HIT_HEAD)

Using DeathMsg event, the killer is provided in the first argument ( read_data(1) ) and to know if it's a headshot, it's provided in the third argument ( read_data(3 ) ). And to know the weapon, see the fourth argument.
__________________
Arkshine is offline
flyeni6
Senior Member
Join Date: Jun 2006
Location: CAli
Old 02-02-2008 , 06:15   Re: New XP Mod tutorial
Reply With Quote #10

Quote:
Originally Posted by arkshine View Post
@flyen16

Can you tell me why are you using get_user_attacker() ?

Code:
public eDeath( ) { new iVictim = read_data( 2 ) new weapon, hitplace, attacker = get_user_attacker(iVictim,weapon,hitplace) if(hitplace == HIT_HEAD)


Using DeathMsg event, the killer is provided in the first argument ( read_data(1) ) and to know if it's a headshot, it's provided in the third argument ( read_data(3 ) ). And to know the weapon, see the fourth argument.
oh crap, lol i wasnt paying attention lol.
ill fix it, thx for telling me
__________________


Last edited by flyeni6; 02-02-2008 at 06:20.
flyeni6 is offline
Send a message via AIM to flyeni6
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:38.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode