PHP Code:
#include < amxmodx >
#include < sqlx >
#include < zombieplague >
#define PLUGIN "Sistema de cuentas MySQL/SQLite"
#define VERSION "1.1.1"
#define AUTHOR "r0ma"
//#define MYSQL
#if defined MYSQL
#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DATEBASE "accounts"
#else
#define SQLITE_DATEBASE "accounts"
#endif
new const szTable[ ] = "Accounts";
new const szPrefix[ ] = "[Accounts]";
new Handle:g_hTuple;
new g_maxplayers;
new g_id[ 33 ];
new g_estado[ 33 ];
new g_usuario[ 33 ][ 34 ];
new g_password[ 33 ][ 34 ];
new g_playername[ 33 ][ 33 ];
enum {
OFFLINE,
LOGUEADO
};
enum
{
CREATE_USER,
CREATE_PASSWORD,
LOGIN_USER,
LOGIN_PASSWORD,
LOADING_DATAS,
SAVE_DATAS
};
/* consulta MYSQL:
CREATE TABLE accounts
(
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
Usuario varchar(34) NOT NULL UNIQUE KEY,
Password varchar(34) NOT NULL,
Pj varchar(32) NOT NULL UNIQUE KEY,
Ammopacks int(10) NOT NULL DEFAULT '0'
)
*/
/* consulta SQLite:
CREATE TABLE "accounts"
(
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"Usuario" VARCHAR NOT NULL UNIQUE,
"Password" VARCHAR NOT NULL,
"Pj" VARCHAR NOT NULL UNIQUE,
"Ammopacks" INTEGER DEFAULT 0
)
*/
public plugin_init( ) {
register_plugin( PLUGIN, VERSION, AUTHOR );
register_clcmd( "CREATE_USER", "reg_usuario" );
register_clcmd( "CREATE_PASSWORD", "reg_password" );
register_clcmd( "LOGIN_USER", "log_usuario" );
register_clcmd( "LOGIN_PASSWORD", "log_password" );
register_clcmd( "chooseteam", "clcmd_changeteam" );
register_clcmd( "jointeam", "clcmd_changeteam" );
register_clcmd( "menuselect", "menu_select" );
register_message( get_user_msgid( "ShowMenu" ), "message_ShowMenu" );
register_message( get_user_msgid( "VGUIMenu" ), "message_VGUIMenu" );
register_event( "HLTV", "event_round_start", "a", "1=0", "2=0" );
g_maxplayers = get_maxplayers( );
MySQLx_Init( );
}
public message_VGUIMenu( iMsgid, iDest, id ) {
if( g_estado[ id ] == LOGUEADO || get_msg_arg_int( 1 ) != 2 )
return PLUGIN_CONTINUE;
show_login_menu( id );
return PLUGIN_HANDLED;
}
public message_ShowMenu( iMsgid, iDest, id ) {
if( g_estado[ id ] == LOGUEADO )
return PLUGIN_CONTINUE;
static sMenuCode[ 33 ];
get_msg_arg_string( 4, sMenuCode, charsmax( sMenuCode ) );
if( containi( sMenuCode, "Team_Select" ) != -1 ) {
show_login_menu( id );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public clcmd_changeteam( id ) {
if( g_estado[ id ] != LOGUEADO ) {
show_login_menu( id );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public show_login_menu( id ) {
static menu, ItemMenu[ 999 ]
formatex( ItemMenu, charsmax( ItemMenu ), "\y/-----------------------\ ^nSystem Account ^n^n^n^n\rThanks to^n\-----------------------/^n\w- \wr0ma.-^n")
menu = menu_create( ItemMenu, "login_menu" );
menu_additem( menu, "Create Account", "1" );
menu_additem( menu, "Login", "2" );
menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu );
menu_destroy( menu );
}
public login_menu( id, menu, item ) {
}
public menu_select( id ) {
if( g_estado[ id ] == OFFLINE ) {
new args[ 3 ];
read_args( args, charsmax( args ) );
if( str_to_num( args ) == 1 )
client_cmd( id, "messagemode CREATE_USER" );
else
client_cmd( id, "messagemode LOGIN_PASSWORD" );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public reg_usuario( id ) {
read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
remove_quotes( g_usuario[ id ] );
trim( g_usuario[ id ] );
md5( g_usuario[ id ], g_usuario[ id ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = CREATE_USER;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
public reg_password( id ) {
read_args( g_password[ id ], charsmax( g_password[ ] ) );
remove_quotes( g_password[ id ] );
trim( g_password[ id ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = CREATE_PASSWORD;
get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) );
formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^")", szTable, g_usuario[ id ], g_password[ id ], g_playername[ id ] );
SQL_ThreadQuery(g_hTuple, "DataHandler", szQuery, iData, 2);
return PLUGIN_HANDLED;
}
public log_usuario( id ) {
read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
remove_quotes( g_usuario[ id ] );
trim( g_usuario[ id ] );
md5( g_usuario[ id ], g_usuario[ id ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGIN_USER;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
public log_password( id ) {
read_args( g_password[ id ], charsmax( g_password[ ] ) );
remove_quotes( g_password[ id ] );
trim( g_password[ id ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGIN_PASSWORD;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^" AND Password=^"%s^"", szTable, g_usuario[ id ], g_password[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
public guardar_datos( id ) {
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = SAVE_DATAS;
formatex( szQuery, charsmax( szQuery ), "UPDATE %s SET Ammopacks='%d' WHERE id='%d'", szTable, zp_get_user_ammo_packs( id ), g_id[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}
public DataHandler( failstate, Handle:Query, error[ ], error2, data[ ], datasize, Float:time ) {
static id;
id = data[ 0 ];
if( !is_user_connected( id ) )
return;
switch( failstate ) {
case TQUERY_CONNECT_FAILED: {
log_to_file( "SQL_LOG_TQ.txt", "Error in connection to MySQL [%i]: %s", error2, error );
return;
}
case TQUERY_QUERY_FAILED:
log_to_file( "SQL_LOG_TQ.txt", "Error in the query to MySQL [%i]: %s", error2, error );
}
switch( data[ 1 ] ) {
case CREATE_USER: {
if( !SQL_NumResults( Query ) )
client_cmd( id, "messagemode CREATE_PASSWORD" );
else {
client_print( id, print_chat, "%s User already exists.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case CREATE_PASSWORD: {
if( failstate < TQUERY_SUCCESS ) {
if( containi( error, "Usuario" ) != -1 )
client_print( id, print_chat, "%s User already exists.", szPrefix );
else if( containi( error, "Pj" ) != -1 )
client_print( id, print_chat, "%s The character name is in use.", szPrefix );
else
client_print( id, print_chat, "%s Error creating account. try again.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
else {
client_print( id, print_chat, "%s Your account has been created correctly.", szPrefix );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOADING_DATAS;
formatex( szQuery, charsmax( szQuery ), "SELECT id, Ammopacks FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}
}
case LOGIN_USER: {
if( SQL_NumResults( Query ) )
client_cmd( id, "messagemode LOGIN_PASSWORD" );
else {
client_print( id, print_chat, "%s Username does not exist.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case LOGIN_PASSWORD: {
if( SQL_NumResults( Query ) ) {
g_id[ id ] = SQL_ReadResult( Query, 0 );
SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );
// Cargamos datos
zp_set_user_ammo_packs( id, SQL_ReadResult( Query, 4 ) );
func_login_success( id );
}
else {
client_print( id, print_chat, "%s Incorrect password.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case LOADING_DATAS: {
if( SQL_NumResults( Query ) ) {
g_id[ id ] = SQL_ReadResult( Query, 0 );
zp_set_user_ammo_packs( id, SQL_ReadResult( Query, 1 ) );
func_login_success( id );
}
else {
client_print( id, print_chat, "%s Error loading data, try again.", szPrefix );
show_login_menu( id );
}
}
case SAVE_DATAS: {
if( failstate < TQUERY_SUCCESS )
console_print( id, "%s Error saving data.", szPrefix );
else
console_print( id, "%s saved data.", szPrefix );
}
}
}
public func_login_success( id ) {
/*new msg_block = get_msg_block( id );
set_msg_block( id, BLOCK_SET );
*/
engclient_cmd( id, "jointeam", "5" );
engclient_cmd( id, "joinclass", "5" );
//set_msg_block( id, msg_block );
g_estado[ id ] = LOGUEADO;
set_user_info( id, "name", g_playername[ id ] );
}
public zp_round_started( ) {
for( new i = 1; i <= g_maxplayers; i++ ) {
if( g_estado[ i ] == LOGUEADO && is_user_connected( i ) )
guardar_datos( i );
}
}
public client_infochanged( id ) {
if( g_estado[ id ] == OFFLINE )
return PLUGIN_CONTINUE;
static name[ 33 ];
get_user_info( id, "name", name, charsmax( name ) );
if( !equal( g_playername[ id ], name ) ) {
set_user_info( id, "name", g_playername[ id ] );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public client_putinserver( id ) {
show_login_menu( id );
}
public client_disconnect( id ) {
if( g_estado[ id ] == LOGUEADO ) {
guardar_datos( id );
g_estado[ id ] = OFFLINE;
}
}
#if defined MYSQL
public MySQLx_Init( )
{
g_hTuple = SQL_MakeDbTuple( MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATEBASE );
if( !g_hTuple )
{
log_to_file( "SQL_ERROR.txt", "Could not connect to the database." );
return pause( "a" );
}
return PLUGIN_CONTINUE;
}
#else
// Gracias ILUSION por fixear la conexión
public MySQLx_Init( )
{
new get_type[ 12 ];
SQL_SetAffinity( "sqlite" );
SQL_GetAffinity( get_type, sizeof get_type );
if( !equali( get_type, "sqlite" ) )
{
log_to_file( "SQLITE_ERROR.txt", "Error of conexion" );
return pause( "a" );
}
g_hTuple = SQL_MakeDbTuple( "", "", "", SQLITE_DATEBASE );
return PLUGIN_CONTINUE
}
#endif
public plugin_end( )
SQL_FreeHandle( g_hTuple );