New XP Mod tutorial

For scripting examples for learning how to use AMXX.
User avatar
Archive-Poster
Posts: 1189
Gender:
United States of America

New XP Mod tutorial

Post by Archive-Poster »

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

Code: Select all

#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

Code: Select all

#define MAXCLASSES 5
We create the variable that is going to hold your class, xp , and level

Code: Select all

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:

Code: Select all

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:

Code: Select all

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()

Code: Select all

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:

Code: Select all

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

Code: Select all

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]]) 
} 
ote: ^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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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: Select all

#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
}

Who is online

Users browsing this forum: No registered users and 1 guest