Thread: Saving Xp data.
View Single Post
Bugsy
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
Old 01-17-2010 , 17:49   Re: Saving Xp data.
Reply With Quote #6

The nSQLx include is not complete yet but will work fine for your plugin.

PHP Code:
#define USE_SQL    1

#include <amxmodx> 

#if defined USE_SQL
#include <nsqlx>
#else
#include <nvault>
#endif

enum _:CLASSES 

    
NoClass,
    
Sniper
    
Sport
    
Ace 
}

enum _:RANKS 

    
NoRank,
    
Rookie
    
Chief
    
Captain 
}

enum _:XPDATA 

    
XPTotal,    //Total XP points player has 
    
XPCLASSES ],    //XP points player has in each class 
    
Class,        //Players current class 
    
Rank        //Players current rank 
}

new const 
g_ClassDescCLASSES ][] = 

    
"None",
    
"Sniper"
    
"Sport"
    
"Ace" 
};

new const 
g_RankDescRANKS ][] = 
{
    
"None",
    
"Rookie"
    
"Chief"
    
"Captain" 
};

//XP point-ranges for each rank. A players rank is defined by XP points 
//he has for each class. 
new const g_RankXPRANKS ][ ] = 

    { 
},    //None - 0 xp points
    
50 },    //Rookie - 1-50 xp points 
    
51 100 },    //Chief - 51-100 xp points 
    
101 150 }    //Captain - 101-150 xp points 
}; 

//Array to store all player xp info 
new g_XP33 ][ XPDATA ]; 

new 
g_szAuthID33 ][ 35 ];

#if defined USE_SQL
new g_iSQL;
#else
new g_iVault;
#endif

public plugin_init() 

    
register_plugin"XP Skeleton" "0.1" "bugsy" ); 
    
    
register_clcmd"say /class" "cmd_SayClass" ); 
    
register_clcmd"say /rank" "cmd_SayRank" ); 
    
register_clcmd"say /current" "cmd_SayCurrent" ); 
    
    
#if defined USE_SQL
    
g_iSQL nsqlx_open"player_xp_data" "SQL_Handler" );
    
#else
    
g_iVault nvault_open"player_xp_data" );
    
#endif


#if !defined USE_SQL
public plugin_end()
{
    
nvault_closeg_iVault );
}
#endif

public client_authorizedid )
{
    
get_user_authidid g_szAuthIDid ] , charsmaxg_szAuthID[] ) );
    
LoadDataid );
}

public 
client_disconnectid )
{
    
SaveDataid );
    
    
//Clear all XP data from array
    
for ( new XPDATA i++ )
        
g_XPid ][ ] = 0;
}


public 
cmd_SayClassid 

    new 
iMenu menu_create"Select New Class" "HandleClassMenu" );
    new 
szNum];
    
    for ( new 
sizeofg_ClassDesc ) ; i++ )
    {
        
num_to_strszNum charsmaxszNum ) );
        
menu_additemiMenu g_ClassDesc] , szNum );
    }
    
    
menu_setpropiMenu MPROP_EXIT MEXIT_NEVER ); 
    
menu_displayid iMenu );


//Just for testing. After setting a class (/class), use /rank command (will assign rank = Chief)
//Now switch to a new class (should show rank Rookie). Now switch back to the first class you chose. 
//You should see your rank is back to Chief.
public cmd_SayRankid )
{
    
g_XPid ][ Class ] = Ace;
    
g_XPid ][ Rank ] = Captain;
    
g_XPid ][ XP ][ g_XPid ][ Class ] ] = 130;
}

public 
cmd_SayCurrentid )
{
    
client_printid print_chat "Class: %s | Rank %s -- XP %d / %d" ,     g_ClassDescg_XPid ][ Class ] ] , 
                                        
g_RankDescg_XPid ][ Rank ] ] ,
                                        
g_XPid ][ XP ][ g_XPid ][ Class ] ] ,
                                        ( 
g_XPid ][ Rank ] + )== RANKS ?  g_RankXPg_XPid ][ Rank ] ][ ] : g_RankXPg_XPid ][ Rank ] + ][ ] );
}

public 
HandleClassMenuid iMenu iItem 
{
    new 
szKey] , iSelectedClass Dummy;
    
menu_item_getinfoiMenu iItem Dummy szKey "" Dummy );
    
    
iSelectedClass str_to_numszKey );
    
    if ( 
g_XPid ][ Class ] == iSelectedClass )
    {
        
client_printid print_chat "* You are already a %s!" g_ClassDesciSelectedClass ] );
        return 
PLUGIN_HANDLED;
    }
    
    
ChangeClassid iSelectedClass );
    
    return 
PLUGIN_HANDLED;
}  

//Change a players class and update his rank based on XP he has for the new class. 
public ChangeClassid NewClass 
{
    
//Assign player his new class, set rank to 0 (first rank) 
    
g_XPid ][ Class ] = NewClass
    
g_XPid ][ Rank ] = 0
    
    
//Loop through array g_RankXP and determine which rank player should be placed 
    //in depending on his current XP points he has for the new class. 
    
for ( new sizeofg_RankXP ) ; i++ ) 
    { 
        
//If players XP points for class falls within range for this rank, update players rank 
        
if ( g_RankXP][ ] <= g_XPid ][ XP ][ NewClass ] <= g_RankXP][ ] ) 
        { 
            
g_XPid ][ Rank ] = i
            break;  
        } 
    } 
    
    
client_printid print_chat "* New class: %s - New Rank: %s" g_ClassDescNewClass ] , g_RankDescg_XPid ][ Rank ] ] ); 
    
    return 
PLUGIN_HANDLED;  
}

public 
SaveDataid )
{
    new 
iPos szSave[ ( XPDATA 10 ) + ];
    
    for ( new 
XPDATA i++ )
        
iPos += formatexszSaveiPos ] ,charsmaxszSave ) , "%10d" g_XPid ][ ] );
    
    
#if defined USE_SQL
    
nsqlx_setg_iSQL id g_szAuthIDid ] , szSave );
    
#else
    
nvault_setg_iVault g_szAuthIDid ] , szSave );
    
#endif
}


public 
LoadDataid )
{

    
#if defined USE_SQL
    
nsqlx_getg_iSQL id g_szAuthIDid ] );
    
#else
    
new iPos szNum11 ] , szLoad[ ( XPDATA 10 ) + ];
    
    
nvault_getg_iVault g_szAuthIDid ] , szLoad  charsmaxszLoad ) );
    
    for ( new 
XPDATA i++ )
    {    
        
iPos += copyszNum 10 szLoadiPos ] );
        
g_XPid ][ ] = str_to_numszNum ); 
    }
    
#endif
}

#if defined USE_SQL
public SQL_HandlerszData[] , iDataLen iRequestID iRequestType SQLHandle szError[] , iError )
{
    if ( ( 
iRequestType == QUERY_GET ) && iDataLen )
    {    
        new 
iPos szNum11 ];
        
        for ( new 
XPDATA i++ )
        {
            
iPos += copyszNum 10 szDataiPos ] );
            
g_XPiRequestID ][ ] = str_to_numszNum );     
        }
    }
}
#endif 
Attached Files
File Type: inc nsqlx.inc (5.3 KB, 255 views)
__________________

Last edited by Bugsy; 01-17-2010 at 17:57.
Bugsy is offline