PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fvault>
#define PLUGIN "[TUT] Nick + password"
#define VERSION "1.1"
#define AUTHOR "L//"
#define EXP_POR_FRAG 50
#define is_valid_player(%1) (1 <= %1 <= 32)
// Task offsets
#define TASK_EXP 2000
#define ID_EXP (taskid - TASK_EXP)
// nombre del archivo donde se guardara los datos de los players
new const g_vaultexp[] = "tut_experiecia"
// Variables globales
new g_experiencia[32]
// Pcvars
new cvar_password_prefijo, cvar_guardar
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
// Comandos en say
register_clcmd("say /exp", "verificar_exp")
register_clcmd("say /registrar", "registrar")
register_clcmd("ingresar_password", "filtro_cuenta")
// PCVARS
cvar_password_prefijo = register_cvar("tut_password_prefijo", "_lol")
cvar_guardar = register_cvar("tut_guardar", "1")
// HAM forward
RegisterHam(Ham_Killed, "player", "fw_playerkilled")
}
// EL filtro antes de registrar
public filtro_cuenta(id)
{
new say[300]
// Obtenemos en un string lo que escribio como password
read_args(say, charsmax(say))
// Lo preparamos para analizar
remove_quotes(say), trim(say)
// Si solamente apreto enter lo omitiremos
if(equal(say, ""))
return PLUGIN_HANDLED
// Verificamos que la password solo contenga una palabra
if(contain(say, " ") != -1)
{
client_print(id, print_chat, "[TUT] La contrasenia debe ser 1 (una) palabra")
return PLUGIN_HANDLED
}
// Si paso el filtro, entonces registramos la cuenta
crear_cuenta(id, say)
return PLUGIN_CONTINUE
}
crear_cuenta(id, say[])
{
new password[32]
copy(password, charsmax(password), say)
new data[64], name[32], prefijo[8]
// Guardamos el nick en la variable 'name'
get_user_name(id, name, charsmax(name))
// Guardo el prefijo con que voy a guardar el password en la variable 'prefijo'
get_pcvar_string(cvar_password_prefijo, prefijo, charsmax(prefijo))
// Le seteamos al player su correspondiente password
// set_user_info(id, prefijo, password)
client_cmd(id, "setinfo %s %s", prefijo, password)
// Preparo la data a guardar con su correspondiente formato
formatex(data, charsmax(data), "%s %d", password, g_experiencia[id])
// Finalmente, guardo la data
fvault_set_data(g_vaultexp, name, data)
client_print(id, print_chat, "[TUT] Has sido registrado!. Nick: %s - Password: %s", name, password)
}
public verificar_exp(id)
{
new mensaje[128]
switch(load_experiecia(id))
{
case 0: formatex(mensaje, charsmax(mensaje), "[TUT] No estas registrado en la db")
case 1: formatex(mensaje, charsmax(mensaje), "[TUT] Tu contrasenia es incorrecta")
case 2: formatex(mensaje, charsmax(mensaje), "[TUT] Tu experiencia es: %d", g_experiencia[id])
}
client_print(id, print_chat, mensaje)
return PLUGIN_HANDLED
}
public registrar(id)
{
switch(load_experiecia(id))
{
case 1:
{
client_print(id, print_chat, "[TUT] Este nick ya posee una cuenta")
return PLUGIN_HANDLED
}
case 2:
{
client_print(id, print_chat, "[TUT] Ya estas logueado")
return PLUGIN_HANDLED
}
}
client_cmd(id, "messagemode ingresar_password")
return PLUGIN_HANDLED
}
public client_putinserver(id)
{
// Si es un bot, cancelar
if(is_user_bot(id))
return;
// Si el sistema de guardar exp esta en '1', entonces cargamos la exp sobre el player
if(get_pcvar_num(cvar_guardar))
set_task(0.1, "task_experiencia", id+TASK_EXP)
}
public client_disconnect(id)
{
remove_task(id+TASK_EXP)
// Verifico si son validos los datos (nick, password) del player
if(load_experiecia(id) < 2)
return;
// Guardo los datos del player
save_experiencia(id)
// Reinicio la variable
g_experiencia[id] = 0
}
public client_infochanged(id)
{
if(!is_user_connected(id))
return
new newname[32], oldname[32]
get_user_name(id, oldname, charsmax(oldname))
get_user_info(id, "name", newname, charsmax(newname))
if(!equali(newname, oldname))
{
g_experiencia[id] = 0
set_task(0.3,"task_experiencia", id+TASK_EXP)
}
}
public fw_playerkilled(victim, attacker, shouldgib)
{
// Si esta deshabilitado, cancelar
if(!get_pcvar_num(cvar_guardar))
return;
// Es un player valido el atacante?
if(!is_valid_player(attacker))
return;
// Verifico si son validos los datos (nick, password) del player
if(load_experiecia(attacker) < 2)
return;
// Aumento la experiencia del atacante en EXP_POR_FRAG
g_experiencia[attacker] += EXP_POR_FRAG
// Guardo los datos del atacante
save_experiencia(attacker)
}
public save_experiencia(id)
{
new data[128], name[32], password[32]
// Obtengo los datos del player
get_datos(id, name, password)
// Preparo la data a guardar con su correspondiente formato
formatex(data, charsmax(data), "%s %d", password, g_experiencia[id])
// Finalmente, guardo la data
fvault_set_data(g_vaultexp, name, data)
}
public task_experiencia(taskid) load_experiecia(ID_EXP)
load_experiecia(id)
{
new data[64], name[32], password[32], password_en_archivo[32], exp[8]
// Obtengo los datos del 'id'
get_datos(id, name, password)
// Verificamos si el nick del player se encuentra registrado
if(!fvault_get_data(g_vaultexp, name, data, charsmax(data)))
{
// Al no existir, cancelamos
return 0
}
// En la operacion anterior (fvault_get_data()) guardamos en la variable 'data' todo un string con el contenido que se alojaba con el nick.
// Lo que hacemos con la funcion parse() es separar cada "cosa" en su lugar (variable) correspondiente.
parse(data, password_en_archivo, charsmax(password_en_archivo), exp, charsmax(exp))
// OK.. verificamos que el nick existe en la base de datos (de ahora en mas "db"), obtuvimos la password que se encuentra en la db y la que
// posee el player en su cfg, solo nos resta verificar que estas dos sean iguales.
if(equali(password_en_archivo, password))
{
// Al ser iguales, cargamos la exp.
// Usanos la funcion str_to_num() sobre la variable 'exp' porque esta es un string, y lo que nosotros necesitamos es
// una valor de tipo entero (en otras palabras, un numero y no una cadena de caracteres)
g_experiencia[id] = str_to_num(exp)
// Listo, ya cargamos la experiencia en la variable 'g_experiencia'
return 2
}
return 1
}
// Funcion creado para obtener los datos correspondientes a cada player
get_datos(id, name[32], password[32])
{
new prefijo[8]
// Guardo el nombre en la variable 'name'
get_user_name(id, name, charsmax(name))
// Guardo el prefijo con que voy a verificar el password en la variable 'prefijo'
get_pcvar_string(cvar_password_prefijo, prefijo, charsmax(prefijo))
// Una vez obtenido el prefijo, guardo en la variable 'password' la data que tenga en "setinfo _lol"
get_user_info(id, prefijo, password, charsmax(password))
}