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
XP[ CLASSES ], //XP points player has in each class
Class, //Players current class
Rank //Players current rank
}
new const g_ClassDesc[ CLASSES ][] =
{
"None",
"Sniper",
"Sport",
"Ace"
};
new const g_RankDesc[ RANKS ][] =
{
"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_RankXP[ RANKS ][ 2 ] =
{
{ 0 , 0 }, //None - 0 xp points
{ 1 , 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_XP[ 33 ][ XPDATA ];
new g_szAuthID[ 33 ][ 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_close( g_iVault );
}
#endif
public client_authorized( id )
{
get_user_authid( id , g_szAuthID[ id ] , charsmax( g_szAuthID[] ) );
LoadData( id );
}
public client_disconnect( id )
{
SaveData( id );
//Clear all XP data from array
for ( new i = 0 ; i < XPDATA ; i++ )
g_XP[ id ][ i ] = 0;
}
public cmd_SayClass( id )
{
new iMenu = menu_create( "Select New Class" , "HandleClassMenu" );
new szNum[ 3 ];
for ( new i = 0 ; i < sizeof( g_ClassDesc ) ; i++ )
{
num_to_str( i , szNum , charsmax( szNum ) );
menu_additem( iMenu , g_ClassDesc[ i ] , szNum , 0 );
}
menu_setprop( iMenu , MPROP_EXIT , MEXIT_NEVER );
menu_display( id , iMenu , 0 );
}
//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_SayRank( id )
{
g_XP[ id ][ Class ] = Ace;
g_XP[ id ][ Rank ] = Captain;
g_XP[ id ][ XP ][ g_XP[ id ][ Class ] ] = 130;
}
public cmd_SayCurrent( id )
{
client_print( id , print_chat , "Class: %s | Rank %s -- XP %d / %d" , g_ClassDesc[ g_XP[ id ][ Class ] ] ,
g_RankDesc[ g_XP[ id ][ Rank ] ] ,
g_XP[ id ][ XP ][ g_XP[ id ][ Class ] ] ,
( g_XP[ id ][ Rank ] + 1 )== RANKS ? g_RankXP[ g_XP[ id ][ Rank ] ][ 1 ] : g_RankXP[ g_XP[ id ][ Rank ] + 1 ][ 0 ] );
}
public HandleClassMenu( id , iMenu , iItem )
{
new szKey[ 3 ] , iSelectedClass , Dummy;
menu_item_getinfo( iMenu , iItem , Dummy , szKey , 2 , "" , 0 , Dummy );
iSelectedClass = str_to_num( szKey );
if ( g_XP[ id ][ Class ] == iSelectedClass )
{
client_print( id , print_chat , "* You are already a %s!" , g_ClassDesc[ iSelectedClass ] );
return PLUGIN_HANDLED;
}
ChangeClass( id , iSelectedClass );
return PLUGIN_HANDLED;
}
//Change a players class and update his rank based on XP he has for the new class.
public ChangeClass( id , NewClass )
{
//Assign player his new class, set rank to 0 (first rank)
g_XP[ id ][ Class ] = NewClass;
g_XP[ id ][ 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 i = 0 ; i < sizeof( g_RankXP ) ; i++ )
{
//If players XP points for class falls within range for this rank, update players rank
if ( g_RankXP[ i ][ 0 ] <= g_XP[ id ][ XP ][ NewClass ] <= g_RankXP[ i ][ 1 ] )
{
g_XP[ id ][ Rank ] = i;
break;
}
}
client_print( id , print_chat , "* New class: %s - New Rank: %s" , g_ClassDesc[ NewClass ] , g_RankDesc[ g_XP[ id ][ Rank ] ] );
return PLUGIN_HANDLED;
}
public SaveData( id )
{
new iPos , szSave[ ( XPDATA * 10 ) + 1 ];
for ( new i = 0 ; i < XPDATA ; i++ )
iPos += formatex( szSave[ iPos ] ,charsmax( szSave ) , "%10d" , g_XP[ id ][ i ] );
#if defined USE_SQL
nsqlx_set( g_iSQL , id , g_szAuthID[ id ] , szSave );
#else
nvault_set( g_iVault , g_szAuthID[ id ] , szSave );
#endif
}
public LoadData( id )
{
#if defined USE_SQL
nsqlx_get( g_iSQL , id , g_szAuthID[ id ] );
#else
new iPos , szNum[ 11 ] , szLoad[ ( XPDATA * 10 ) + 1 ];
nvault_get( g_iVault , g_szAuthID[ id ] , szLoad , charsmax( szLoad ) );
for ( new i = 0 ; i < XPDATA ; i++ )
{
iPos += copy( szNum , 10 , szLoad[ iPos ] );
g_XP[ id ][ i ] = str_to_num( szNum );
}
#endif
}
#if defined USE_SQL
public SQL_Handler( szData[] , iDataLen , iRequestID , iRequestType , SQLHandle , szError[] , iError )
{
if ( ( iRequestType == QUERY_GET ) && iDataLen )
{
new iPos , szNum[ 11 ];
for ( new i = 0 ; i < XPDATA ; i++ )
{
iPos += copy( szNum , 10 , szData[ iPos ] );
g_XP[ iRequestID ][ i ] = str_to_num( szNum );
}
}
}
#endif