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

Updated Flyen's EXP Tutorial (Fixed Errors)


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
qlail
Member
Join Date: Aug 2009
Old 08-30-2010 , 12:26   Updated Flyen's EXP Tutorial (Fixed Errors)
Reply With Quote #1

Hey guys, I read through Flyen's thread about his old EXP tutorial, seen that a LOT of people were having trouble and not understanding why they were getting errors... WELL, I'll post a working tutorial.

First: Include Your Modules
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault> 
Then Define your classes, simply like this
PHP Code:
#define MAXCLASSES 5 
Now we have to create the EXP, Levels, and Class Variables.

PHP Code:
new PlayerXP,PlayerLevel,PlayerClass[33]
//These are for your special kills
new XP_Kill,XP_Knife,XP_Hs
//This is for the vault, so your EXP saves to the server
new g_vault 
This is where your Maxclasses comes in
PHP Code:
new const CLASSES[MAXCLASSES][] {
             
"None",
             
"Rifle Specialist",
             
"Sniper Specialist",
             
"Pistol Specialist",
             
"Machine Gun Specialist"

Now we will make the Levels with the Exp you desire
PHP Code:
new const LEVELS[10] = {
             
"100",
             
"200",
             
"400",
             
"800",
             
"1600",
             
"3200",
             
"6400",
             
"12800",
             
"25600",
             
"51200"

Now we create the plugin_init
PHP Code:
public plugin_init()
{
          
register_plugin("Simple EXP Mod""1.0""Thelius"// Registers the Plugin to the ModName, Version, and Creator
          
register_event("DeathMsg""eDeath""a"// This is the death event
          
SaveXP register_cvar("SaveXP""1"// This is to make sure that Saving XP is enabled
          
XP_Kill register_cvar("XP_per_kill""40"// This defines the amount of EXP you gain per kill
          
XP_Hs register_cvar("XP_hs_bonus""50"// This defines the amount of exp gained per headshot
          
XP_Knife register_cvar("XP_knife_bonus""20"// This defines the amount of Exp gained per Knife Kill
          
g_vault nvault_open("XPMod"// This opens the nvault so it can save the exp

          
register_clcmd("say /class""ChangeClass"// Saying /class will open the class menu
          
register_clcmd("say_team /class""ChangeClass"// Team saying /class will open the class menu
          
register_clcmd("say /xp""ShowHud"// Saying /xp will show your EXP
          
register_clcmd("say_team /xp""ShowHud"// Team Saying /xp will show your EXP

Now we create the Death event, so it will keep your levels and exp, remember we called it eDeath, Let's begin.

PHP Code:
public eDeath( )
{
        new 
headshot,attacker read_data)
        new 
weapon get_user_weapon(attacker,headshot,headshot)
        
headshot read_data)

        
PlayerXP[attacker] += get_pcvar_num(XP_Kill)

        if(
PlayerClass[attacker] == 0)

        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(attackerprint_chat"[XP Mod] Congratulations you are now level %i %s!");
                      
PlayerLevel[attacker] += 1
         
}
         
ShowHud(attacker)
         
SaveData(attacker)

We set the Hud to show the EXP and all that fun stuff
PHP Code:
public ShowHud(id)
{
            
set_hudmessage(025500.280.8806.012.0)
            
show_hudmessage(id"Level: %i^nXP: %i^nClass: %s"PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id]])

Now we create the Change Class Menu
PHP Code:
public ChangeClass(id)
{
        new 
menu menu_create("Class Menu""Class_Handle");
        
        
menu_additem(menu ,"Rifle Specialist""1" 0);
        
menu_additem(menu ,"Sniper Specialist""2" 0);
        
menu_additem(menu ,"Pistol Specialist""3" 0);
        
menu_additem(menu ,"Machine Gun Specialist""4" 0);

        
menu_setprop(menu MPROP_EXIT MEXIT_ALL);

        
menu_display(id menu 0);

        return 
PLUGIN_CONTINUE;

Now we create the Menu Handler for the Class Menu

PHP Code:
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"[XP Mod] You are now a %s"CLASSES[i])
         }
         else
         {
                    
client_print(id,print_chat"[XP Mod] You are already a %s",CLASSES[i]
         }

         
menu_destroy(menu);
         return 
PLUGIN_CONTINUE

Now we set the Exp to load on someone who joins and has saved EXP

PHP Code:
public client_connect(id)
{
         if(
get_pcvar_num(SaveXP) == 1)
         {

                  
LoadData(id)
         }

Now we set the Exp To save on someone who disconnects from the server

PHP Code:
public client_disconnect(id)
{
         if(
get_pcvar_num(SaveXP) == 1)
         {
         
                  
SaveData(id)
         }
         
PlayerXP[id] = 0
         PlayerLevel
[id] = 0
         PlayerClass
[id] = 0

Now we set the exp to save to the Clients steam id

PHP Code:
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

Now we set it to Load the Clients Exp Based on his Steam ID

PHP Code:
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(vaultdata255"#"" ")

         new 
playerxp[32], playerlevel[32]

         
parse(vaultdataplayerxp31playerlevel31)

         
PlayerXP[id] = str_to_num(playerxp)
         
PlayerLevel[id] = str_to_num(playerlevel)

         return 
PLUGIN_CONTINUE

And we're Finished

This is what it looks like all together
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>

new PlayerXP,PlayerLevel,PlayerClass[33]
//These are for your special kills
new XP_Kill,XP_Knife,XP_Hs
//This is for the vault, so your EXP saves to the server
new g_vault

new const CLASSES[MAXCLASSES][] {
             
"None",
             
"Rifle Specialist",
             
"Sniper Specialist",
             
"Pistol Specialist",
             
"Machine Gun Specialist"
}

new const 
LEVELS[10] = {
             
"100",
             
"200",
             
"400",
             
"800",
             
"1600",
             
"3200",
             
"6400",
             
"12800",
             
"25600",
             
"51200"
}

public 
plugin_init()
{
          
register_plugin("Simple EXP Mod""1.0""Thelius"// Registers the Plugin to the ModName, Version, and Creator
          
register_event("DeathMsg""eDeath""a"// This is the death event
          
SaveXP register_cvar("SaveXP""1"// This is to make sure that Saving XP is enabled
          
XP_Kill register_cvar("XP_per_kill""40"// This defines the amount of EXP you gain per kill
          
XP_Hs register_cvar("XP_hs_bonus""50"// This defines the amount of exp gained per headshot
          
XP_Knife register_cvar("XP_knife_bonus""20"// This defines the amount of Exp gained per Knife Kill
          
g_vault nvault_open("XPMod"// This opens the nvault so it can save the exp

          
register_clcmd("say /class""ChangeClass"// Saying /class will open the class menu
          
register_clcmd("say_team /class""ChangeClass"// Team saying /class will open the class menu
          
register_clcmd("say /xp""ShowHud"// Saying /xp will show your EXP
          
register_clcmd("say_team /xp""ShowHud"// Team Saying /xp will show your EXP
}

public 
eDeath( )
{
        new 
headshot,attacker read_data)
        new 
weapon get_user_weapon(attacker,headshot,headshot)
        
headshot read_data)

        
PlayerXP[attacker] += get_pcvar_num(XP_Kill)

        if(
PlayerClass[attacker] == 0)

        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(attackerprint_chat"[XP Mod] Congratulations you are now level %i %s!");
                      
PlayerLevel[attacker] += 1
         
}
         
ShowHud(attacker)
         
SaveData(attacker)
}

public 
ShowHud(id)
{
            
set_hudmessage(025500.280.8806.012.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 ,"Rifle Specialist""1" 0);
        
menu_additem(menu ,"Sniper Specialist""2" 0);
        
menu_additem(menu ,"Pistol Specialist""3" 0);
        
menu_additem(menu ,"Machine Gun Specialist""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"[XP Mod] You are now a %s"CLASSES[i])
         }
         else
         {
                    
client_print(id,print_chat"[XP Mod] You are already 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(vaultdata255"#"" ")

         new 
playerxp[32], playerlevel[32]

         
parse(vaultdataplayerxp31playerlevel31)

         
PlayerXP[id] = str_to_num(playerxp)
         
PlayerLevel[id] = str_to_num(playerlevel)

         return 
PLUGIN_CONTINUE

To add HP every 5 levels or however you want it. simply do all these things
PHP Code:
#include <fun> // Not sure if this is needed or not, but couldn't get mine to work without.
#include <fakemeta> // Will use for a future update, already used, just trying to get someone to help me with testing.

public plugin_init()
//[....]

        
register_event("ResetHUD""on_spawn""be")

//[....]

YOU WILL NEED TO CREATE THIS WITHIN THE .SMA THIS IS NOT IN THE ORIGINAL!

PHP Code:
public on_spawn(id)
{
       if (
PlayerLevel[id] <= 5// The number 5 Decides which levels are included, and Hopefully you know simple math to know what the <= means..
       
{
               
set_user_health(id150);
        }


Last edited by qlail; 09-10-2010 at 22:02. Reason: Had an update
qlail is offline
 



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 05:44.


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