[ZP] registro CSAxel
#1
Entro al servidor y cuando voy a crear mi contraseña me manda el mensaje de la imagen y no solo a mi a la mayoría de los usuarios, yo probé mas de 8 claves diferentes cortas, largas y sin espacios y seguía con lo mismo (Algunos si pudieron entrar).

[Imagen: bf8cf0fb4482fbcac935def2d677f9a5.jpg]

https://amxmodx-es.com/Thread-Sistema-de...vault-BETA

Código PHP:
/** Versión del Plugin **/
new const g_szPluginVersion[] = "v2.0 BETA";

/**

Publicación: https://amxmodx-es.com/Thread-Sistema-de-Cuentas-por-adv-vault

Créditos:
    - kikizon2: Por su sistema de cuentas también hecho por adv_vault. Me inspiró a que yo haga uno nuevo más dinámico y más cosas.
    - Destro: Por su sistema API de guardado Advance Vault System
    - Metrikcz: Por su Aporte: https://amxmodx-es.com/Thread-CODIGO-Buscador-de-jugadores-Adv-Vault
    - Mario.AR: Por su código de mejorar el remuevo de comillas
    - Gonza.-*: Por su stock para Chequear un caracter inválido

Changelog (Cambios producidos)
 - v2.0
    - Se arregló un error en el comando amx_bancuentas que se cancelaba la restricción al comando (Es decir que lo podía usar cualquiera)
    - Se optimizaron todos los chequeos (Condiciones)
    - Se eliminaron aquellos chequeos innecesarios
    - Se agregaron chequeos adicionales para evitar errores de tipeo
    - Se arregló un error con la obtención de la fecha sobre los usuarios baneados
    - Se agregó un nuevo stock: StringCount();
    - Se agregó nuevamente las restricciones al menú OldStyle (Gracias FierroCross)
    - client_infochanged(); --> FM_ClientUserInfoChanged
    - Agregado Callbacks a los menús
    - Se agregaron comentarios para entender más las funciones y demases
    - Se modificó la mayoría del código para un mejor uso
 - v1.5
    - Se cambió la estructura del Sistema
    - Se corrigió un mega BUG que crasheaba el CS con el Auto-ban
    - Se corrigió un mega BUG que las fechas no coincidian como corresponde
    - Se corrigió un BUG del menú al registrarse
    - Se corrigió un BUG que expulsaba al usuario que dio ban, en vez del al baneado
    - Se removió el comando menuselect para menú de estilo viejo (Se recomienda usar el estilo VGUI)
    - Se eliminó bastante código innecesario
    - Se agregaron menús y otras cosas eficientes
    - Se agrego la hora al momento de banear
 - v1.4
    - Se corrigieron varios bugs que se encontraron al probar el Sistema más profundamente
    - Se agrego un sistema de ban automático (Se explica en la parte de contenido)
 - v1.3
    - Se agregó un mejor sistema de restricción de caracteres
    - Se agregó un stock para remover las comillas con más facilidad (Gracias Mario.AR)
    - Se agregó un menú de confirmación de ban (Si acepta, lo banea instantaneamente, sino, vuelve al menú de ban)
    - Se arregló un problema con el auto-ingreso
    - Se arregló un problema con el guardado de datos y cargado de los mismos
    - Se mejoró el guardado de IP y el ingreso automático por su medio
    - Se mejoró el sistema de ban / desban de cuentas
    - Se mejoraron las variables booleanas (Utilizando Bitsums)
    - Se optimizó el programa para mayor utilidad
 - v1.2
   - Se agregó un sistema de cambio de contraseña (A través de un comando)
   - Se agregó en el menú de Ban de cuenta, un Sub-menú que te muestra el listado de exclusiones realizadas.
   - Se optimizó el programa y removido algunos comandos innecesarios
   - Se corrigieron algunos errores en el guardado
   - Se corrigió un error en la función de desbaneo de cuentas (A través del tiempo)
   - Se corrigieron algunas faltas de ortografía :S
 - v1.1:
   - Se agrego la restricción de caracteres especiales sobre los Nombres y contraseñas.
   - Se agregó el Fix Label para el registro de nombres.
   - Se arreglaron errores menores.
 - v1.0: Lanzamiento del programa.

**/

/** Librerías **/
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <adv_vault>
#include <colorchat>
#include <hamsandwich>

/** Datos del Plugin **/
new const g_szPluginName[] = "Sistema de Cuentas";
new const 
g_szPluginAuthor[] = "CSAxel (Rubio.-)";
new const 
g_szPluginCvar[] = "sys_version";

#pragma semicolon 1

/** Enumeraciones **/
enum
{
    
D_PJ 0,
    
D_PASSWORD,
    
D_IP,
    
D_ADMINBAN,
    
D_FECHABAN,
    
D_FECHAVEN,
    
D_RAZONBAN,
    
D_AUTOLOG,
    
    
MAX_DATOS
};

/** Arrays strings **/
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre está restringido en este servidor";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
"#",
    
"/",
    
"(",
    
")",
    
"\\",
    
"%",
    
"^""
};

/** Variables del jugador (Bits) **/
new g_bConnected;
new g_bBanned;
new g_bLogged;
new g_bChangePass;

/** Variables del jugador (Ints) **/
new g_iTypeBan[33];
new g_iAutoLog[33];

/** Variables del jugador (String) **/
new g_szPlayerName[33][32];
new g_szPassword[33][34];
new g_szPlayerIP[33][21];
new g_szFechaBan[33][20];
new g_szFechaVen[33][20];
new g_szAdminBan[33][32];
new g_szRazonBan[33][64];

/** Variables Globales (Strings) **/
new g_szSimbol[2];
new g_szPlayerName_Ban[32];

/** Variables globales (Ints) **/
new g_iVault;
new g_iMenuCB;
new g_iCampos[MAX_DATOS];
new g_iMaxPlayers[1 char];

/** Variables globales (MsgID) **/
new g_iMsgID_ShowMenu;
new g_iMsgID_VGUIMenu;

/** HamHook **/
new HamHook:g_iHam_PreThink;

/** Constantes **/
const TASK_DESBAN = 21050;
const OFFSET_MENU = 205;
const OFFSET_VGUI_MENU = 2;
const ADMIN_ACCESS_MENU = ADMIN_RCON;
const TIME_DESBAN = 600;

/** Inicio del Plugin **/
public plugin_init()
{
    /** Datos del plugin **/
    register_plugin(g_szPluginName, g_szPluginVersion, g_szPluginAuthor);
    register_cvar(g_szPluginCvar, g_szPluginVersion, FCVAR_SERVER | FCVAR_SPONLY);
    set_cvar_string(g_szPluginCvar, g_szPluginVersion);
    
    /** Ham Forwards **/
    DisableHamForward(g_iHam_PreThink = RegisterHam(Ham_Player_PreThink, "
player", "Ham_PlayerPreThink_Post", true));
    
    /** Fakemeta Forwards **/
    register_forward(FM_ClientUserInfoChanged, "
Fwd_ClientChangeName");
    register_forward(FM_ChangeLevel, "
Fwd_ChangeLevel");
    
    /** Messages ID **/
    g_iMsgID_ShowMenu = get_user_msgid("
ShowMenu");
    g_iMsgID_VGUIMenu = get_user_msgid("
VGUIMenu");
    register_message(g_iMsgID_ShowMenu, "
Message_ShowMenu");
    register_message(g_iMsgID_VGUIMenu, "
Message_VGUIMenu");
    
    /** Comandos de consola (Cliente) **/
    register_concmd("
amx_bancuentas", "ConCmd_BanCuentas", ADMIN_ACCESS_MENU);
    
    /** Comandos del cliente **/
    register_clcmd("
say /configs", "Clcmd_ShowConfig");
    
    register_clcmd("
CREATE_PASSWORD", "Clcmd_CreatePw");
    register_clcmd("
CONFIRM_PASSWORD", "Clcmd_ConfirmPw");
    register_clcmd("
IDENTIFLY_PASSWORD", "Clcmd_IdentiflyPw");
    register_clcmd("
CURRENT_PASSWORD", "Clcmd_CurrentPw");
    register_clcmd("
INSERT_USERNAME", "Clcmd_InsertUsername");
    register_clcmd("
INSERT_DATE", "Clcmd_InsertDate");
    register_clcmd("
INSERT_REASON", "Clcmd_InsertReason");
    
    /** Comandos del servidor **/
    register_clcmd("
chooseteam", "Clcmd_ChangeTeam");
    register_clcmd("
jointeam", "Clcmd_ChangeTeam");
    register_clcmd("
menuselect", "Clcmd_MenuSelect");
    
    /** MaxPlayers y Callbacks **/
    g_iMaxPlayers{0} = get_maxplayers();
    g_iMenuCB = menu_makecallback("
CM_Register");
    
    /** Creación de la DB **/
    g_iVault = adv_vault_open("
DB_Cuentas", false);
    g_iCampos[D_PJ] = adv_vault_register_field(g_iVault, "
PJ", DATATYPE_STRING, sizeof(g_szPlayerName[]));
    g_iCampos[D_PASSWORD] = adv_vault_register_field(g_iVault, "
Password", DATATYPE_STRING, sizeof(g_szPassword[]));
    g_iCampos[D_IP] = adv_vault_register_field(g_iVault, "
IP", DATATYPE_STRING, sizeof(g_szPlayerIP[]));
    g_iCampos[D_ADMINBAN] = adv_vault_register_field(g_iVault, "
AdminBAN", DATATYPE_STRING, sizeof(g_szAdminBan[]));
    g_iCampos[D_FECHABAN] = adv_vault_register_field(g_iVault, "
FechaBAN", DATATYPE_STRING, sizeof(g_szFechaBan[]));
    g_iCampos[D_FECHAVEN] = adv_vault_register_field(g_iVault, "
FechaVEN", DATATYPE_STRING, sizeof(g_szFechaVen[]));
    g_iCampos[D_RAZONBAN] = adv_vault_register_field(g_iVault, "
RazonBAN", DATATYPE_STRING, sizeof(g_szRazonBan[]));
    g_iCampos[D_AUTOLOG] = adv_vault_register_field(g_iVault, "
AutoLog");
    adv_vault_init(g_iVault);
    
    /** Ciclo/Chequeo de cuentas baneadas **/
    set_task(float(TIME_DESBAN), "
DesbanCuentas", TASK_DESBAN, .flags = "b");
}

/** AmxMod Forwards **/
public client_putinserver(id)
{
    get_user_name(id, g_szPlayerName[id], charsmax(g_szPlayerName[]));
    get_user_ip(id, g_szPlayerIP[id], charsmax(g_szPlayerIP[]));
    
    if (CheckString(g_szPlayerName[id], g_szSimbol, charsmax(g_szSimbol)))
    {
        server_cmd("
kick #%d ^"%s^"", get_user_userid(id), g_szMessage1);
        
return;
    }
    
    
g_szPassword[id][0] = '^0';
    
g_szAdminBan[id][0] = '^0';
    
g_szFechaBan[id][0] = '^0';
    
g_szFechaVen[id][0] = '^0';
    
g_szRazonBan[id][0] = '^0';
    
    
g_bConnected |= (1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
    
g_iTypeBan[id] = 0;
    
g_iAutoLog[id] = 0;
    
    
CargarDatos(id);
}

public 
client_disconnect(id)
{
    if (
g_bLogged & (1<<(id 1)) && ~g_bBanned & (1<<(id 1)))
        
GuardarDatos(id0);
    
    
g_bConnected &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
}

/** Ham Forwards **/
public Ham_PlayerPreThink_Post(id)
{
    
set_pdata_int(idOFFSET_MENU0);
    
DisableHamForward(g_iHam_PreThink);
}

/** Fakemeta Forwards **/
public Fwd_ClientChangeName(id)
{
    if (~
g_bConnected & (1<<(id 1)))
        return 
FMRES_IGNORED;
    
    static 
szCurrentName[32];
    
get_user_info(id"name"szCurrentNamecharsmax(szCurrentName));
    
    if (
equal(szCurrentNameg_szPlayerName[id]))
        return 
FMRES_IGNORED;
    
    
set_user_info(id"name"g_szPlayerName[id]);
    return 
FMRES_SUPERCEDE;
}

public 
Fwd_ChangeLevel()
{
    static 
id;
    for (
id 1id <= g_iMaxPlayers{0}; id++)
    {
        if (~
g_bConnected & (1<<(id 1)))
            continue;
        
        if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
            continue;
        
        
GuardarDatos(id0);
    }
    
    return 
FMRES_IGNORED;
}

/** Comandos de consola (Cliente) **/
public ConCmd_BanCuentas(idiLevel)
{
    if (~
get_user_flags(id) & iLevel)
        return 
PLUGIN_HANDLED;
    
    
SM_BanMenu(id);
    return 
PLUGIN_HANDLED;
}

/** Comandos del cliente **/
public Clcmd_ShowConfig(id)
{
    if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
        return 
PLUGIN_HANDLED;
    
    
SM_Configs(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_CreatePw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    if (!
g_szPassword[id][0] || StringCount(g_szPassword[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene espacios. Inténtalo nuevamente"g_szPrefix);
        return;
    }
    
    if (
CheckString(g_szPassword[id], g_szSimbolcharsmax(g_szSimbol)))
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene un caracter inválido ^x04(^x01%s^x04)"g_szPrefixg_szSimbol);
        return;
    }
    
    
client_cmd(id"messagemode ^"CONFIRM_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Para completar tu registro... Repite tu contraseña"g_szPrefix);
}

public 
Clcmd_ConfirmPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    if (!
equal(szPasswordg_szPassword[id]))
    {
        
SM_Register(id);
        
ChatColor(idRED"^x04%s^x03 Las contraseñas no coinciden... Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id0);
    if (
g_bChangePass & (1<<(id 1)))
    {
        
SM_Configs(id);
        
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido cambiada correctamente."g_szPrefix);
        return;
    }
        
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
    
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido creada correctamente."g_szPrefix);
    
set_task(1.0"Bienvenida"id);
}

public 
Clcmd_IdentiflyPw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szBufferg_szPassword[id]))
    {
        
client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id1);
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
}

public 
Clcmd_CurrentPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szPasswordszBuffer))
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
g_bChangePass |= (1<<(id 1));
    
g_szPassword[id][0] = '^0';
    
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Contraseña correcta... Para completar tu registro escribe tu nueva contraseña."g_szPrefix);
}

public 
Clcmd_InsertUsername(id)
{
    static 
szName[32];
    
read_args(szNamecharsmax(szName));
    
szRemove_Quotes(szNameszName);
    
trim(szName);
    
    if (!
szName[0] || StringCount(szName' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        
ChatColor(idRED"^x04%s^x03 El nombre no contiene espacios. Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
SM_FindPlayer(idszName);
    
formatex(g_szAdminBan[id], charsmax(g_szAdminBan[]), g_szPlayerName[id]);
}

public 
Clcmd_InsertDate(id)
{
    
read_args(g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
szRemove_Quotes(g_szFechaVen[id], g_szFechaVen[id]);
    
trim(g_szFechaVen[id]);
    
    if (!
g_szFechaVen[id][0] || StringCount(g_szFechaVen[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idRED"^x04%s^x03 La fecha no contiene espacios. Inténtalo nuevamente o más tarde"g_szPrefix);
        return;
    }
    
    static 
szHora[10];
    
get_time("%H:%M:%S"szHoracharsmax(szHora));
    
format(g_szFechaVen[id], charsmax(g_szFechaVen[]), "%s - %s"g_szFechaVen[id], szHora);
    
    
client_cmd(id"messagemode ^"INSERT_REASON^"");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa la razón sobre el ban del jugador."g_szPrefix);
}

public 
Clcmd_InsertReason(id)
{
    
read_args(g_szRazonBan[id], charsmax(g_szRazonBan[]));
    
szRemove_Quotes(g_szRazonBan[id], g_szRazonBan[id]);
    
trim(g_szRazonBan[id]);
    
    if (!
g_szRazonBan[id][0] || StringCount(g_szRazonBan[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_REASON^"");
        
ChatColor(idRED"^x04%s^x03 La razón no contiene espacios. Inténtalo nuevament"g_szPrefix);
        return;
    }
    
    static 
iMenuszText[156];
    
iMenu menu_create("¿ Confirmar ?""HandlerMenu_Confirmar");
    
    
menu_additem(iMenu"Si, banear ahora");
    
menu_additem(iMenu"No, reescribir datos");
    
    
menu_addblank(iMenu0);
    
formatex(szTextcharsmax(szText), "\yJugador\r: \w%s^n\
                        \yFecha de vencimiento\r: \w%s^n\
                        \yRazón del ban\r: \w%s"

    
g_szPlayerName_Bang_szFechaVen[id], g_szRazonBan[id]);
    
menu_addtext(iMenuszText0);
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

/** Comandos del servidor **/
public Clcmd_ChangeTeam(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    
SM_Register(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_MenuSelect(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    static 
szArgs[2], iKey;
    
read_argv(1szArgscharsmax(szArgs));
    
iKey = (str_to_num(szArgs) - 1);
    
    switch (
iKey)
    {
        case 
0client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        case 
1client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        default:
        {
            
SM_Register(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

/** ShowMenus **/
SM_Register(id)
{
    static 
iMenuszText[256];
    
formatex(szTextcharsmax(szText), "Bienvenido a nuestro servidor con \r%s"g_szPluginName);
    
iMenu menu_create(szText"HM_Register");
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_additem(iMenu"Salir del servidor^n");
        
        
formatex(szTextcharsmax(szText), "\yTU CUENTA ESTA BANEADA\r:^n\
        \yAdministrador\r:\w %s^n\
        \yFecha de ban\r:\w %s^n\
        \yFecha de Vencimiento\r:\w %s^n\
        \yRazón\r:\w %s"
g_szAdminBan[id], g_szFechaBan[id], g_szFechaVen[id], g_szRazonBan[id]);
        
menu_addtext(iMenuszText0);
    }
    else
    {
        
menu_additem(iMenu"Crear nueva cuenta", .callback g_iMenuCB);
        
menu_additem(iMenu"Identificarse", .callback g_iMenuCB);
    }
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

SM_BanMenu(id)
{
    static 
iMenuszText[18];
    
iMenu menu_create("Ban de cuentas""HM_BanMenu");
    
    
menu_additem(iMenu"Buscar jugador...");
    
formatex(szTextcharsmax(szText), "Acción: %s^n"g_iTypeBan[id] ? "\rDesbanear" "\yBanear");
    
menu_additem(iMenuszText);
    
    
menu_additem(iMenu"Lista de jugadores excluidos");
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_FindPlayer(idszName[])
{
    static 
iKeyIndexiResultadosiMenuszKeyIndex[2], szText[64];
    
formatex(szTextcharsmax(szText), "\yNombres que contengan\r: \w%s\r\R"szName);
    
iMenu menu_create(szText"HM_FindPlayer");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_PJ], szNameFINDFLAGS_CONTAIN|FINDFLAGS_CASE_SENSITIVE);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_PJ], szTextcharsmax(szText));
        
num_to_str(iKeyIndexszKeyIndexcharsmax(szKeyIndex));
        
menu_additem(iMenuszTextszKeyIndex);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"Iniciar nueva busqueda""0");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_PlayerList(id)
{
    static 
iMenuiKeyIndexiResultadosszName[32], szFecha[12], szText[64];
    
iMenu menu_create("Lista de jugadores excluidos\r\R""HM_PlayerList");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], "/"FINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechacharsmax(szFecha));
        
adv_vault_get_keyname(g_iVaultiKeyIndexszNamecharsmax(szName));
        
formatex(szTextcharsmax(szText), "\w%s \r- \yFecha\r: \w%s"szNameszFecha);
        
menu_additem(iMenuszText);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"No se encontraron usuarios baneados");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_Configs(id)
{
    static 
iMenuszText[52];
    
iMenu menu_create("Configurar mi cuenta""HM_Configs");
    
    
menu_additem(iMenu"Cambiar mi contraseña");
    
formatex(szTextcharsmax(szText), "¿ Recordar mi cuenta ? %s^n^n\
    \yCUENTA\r: \w#%d"
g_iAutoLog[id] ? "\y[Si]" "\r[No]"adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
menu_additem(iMenuszText);
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

/** Callbacks Menus **/
public CM_Register(idiMenuiItem)
{
    if (!
CheckName(id) && !iItem)
        return 
ITEM_ENABLED;
    else if (
CheckName(id) && iItem)
        return 
ITEM_ENABLED;
    
    return 
ITEM_DISABLED;
}

/** Handlers Menus **/
public HM_Register(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_destroy(iMenu);
        
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
client_cmd(id"messagemode ^"%s^""iItem "IDENTIFLY_PASSWORD" "CREATE_PASSWORD");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

public 
HM_BanMenu(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    switch (
iItem)
    {
        case 
0
        {
            
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
            
ChatColor(idBLUE"^x04%s^x03 Ingresa el nombre del jugador ^x04(^x01Puede ser una parte de él^x04)^x01."g_szPrefix);
        }
        case 
1
        {
            
g_iTypeBan[id] = !(g_iTypeBan[id]);
            
SM_BanMenu(id);
        }
        case 
2SM_PlayerList(id);
    }
    
    return 
PLUGIN_HANDLED;
}

public 
HM_FindPlayer(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
        
SM_BanMenu(id);
        
g_szAdminBan[id][0] = '^0';
        return 
PLUGIN_HANDLED;
    }
    
    static 
iGetInfoszItem[2], szName[32], iKeyIndex;
    
menu_item_getinfo(iMenuiItemiGetInfoszItemcharsmax(szItem), szNamecharsmax(szName), iGetInfo);
    
iKeyIndex str_to_num(szItem);
    
    if (!
iKeyIndex)
    {
        
menu_destroy(iMenu);
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        return 
PLUGIN_HANDLED;
    }
    
    
formatex(g_szPlayerName_Bancharsmax(g_szPlayerName_Ban), szName);
    
    if (
g_iTypeBan[id])
        
ShowBanPlayer(id1);
    else
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa la fecha de vencimiento"g_szPrefix);
        
ChatColor(idBLUE"^x04%s^x03 Formato de fecha:^x01 MES / DÍA / AÑO ^x04(Dos últimos dígitos)."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_PlayerList(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
SM_BanMenu(id);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
SM_PlayerList(id);
    return 
PLUGIN_HANDLED;
}

public 
HandlerMenu_Confirmar(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (!
iItem)
        
ShowBanPlayer(id0);
    else
        
SM_BanMenu(id);
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_Configs(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
iItem)
    {
        
g_iAutoLog[id] = !(g_iAutoLog[id]);
        
SM_Configs(id);
    }
    else
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña actual para continuar."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
Message_ShowMenu(iMsgIDiDestiEntity)
{
    static 
szMenuCode[32];
    
get_msg_arg_string(4szMenuCodecharsmax(szMenuCode));
    
    if (
contain(szMenuCode"#Team") == -1)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);    
    
EnableHamForward(g_iHam_PreThink);
    return 
PLUGIN_HANDLED;
}

public 
Message_VGUIMenu(iMsgIDiDestiEntity)
{
    if (
get_msg_arg_int(1) != OFFSET_VGUI_MENU)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);
    return 
PLUGIN_HANDLED;
}

public 
CheckUser(id)
{
    if (~
g_bLogged & (1<<(id 1)))
    {
        static 
szFechaBan[15], szPlayerIP[21];
        
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
strlen(szFechaBan) > 3)
            
g_bBanned |= (1<<(id 1));
        else
        {
            
adv_vault_get_field(g_iVaultg_iCampos[D_IP], szPlayerIPcharsmax(szPlayerIP));
            if (
g_iAutoLog[id] && equal(szPlayerIPg_szPlayerIP[id]))
            {
                
g_bLogged |= (1<<(id 1));
                
engclient_cmd(id"chooseteam");
                return;
            }
        }
        
        
SM_Register(id);
    }
}

public 
ShowBanPlayer(idiTypeBan)
{
    switch (
iTypeBan)
    {
        case 
0:
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
server_cmd("kick ^"%s^" ^"%s^""g_szPlayerName_Bang_szMessage2);
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 baneó la cuenta de ^x04%s^x03 -^x01 Fecha de vencimiento: ^x04%s"g_szPrefixg_szAdminBan[id], g_szPlayerName_Bang_szFechaVen[id]);
            
ChatColor(0GREEN"^x04%s^x01 Razón de ban:^x04 %s"g_szPrefixg_szRazonBan[id]);
        }
        case 
1:
        {
            static 
szFechaBan[21];
            
adv_vault_get_prepare(g_iVault_g_szPlayerName_Ban);
            
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
            
            if (
containi(szFechaBan[2], "") != -&& containi(szFechaBan[5], "") != -1)
            {
                
ChatColor(idGREEN"^x04%s^x01 El jugador que intentas desbanear, no está baneado en el servidor."g_szPrefix);
                return;
            }
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 desbaneó la cuenta de ^x04%s"g_szPrefixg_szPlayerName[id], g_szPlayerName_Ban);
        }
    }
}

public 
GuardarDatos(idisIP)
{
    
adv_vault_set_start(g_iVault);
    if (
isIP)
        
adv_vault_set_field(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id]);
    else
    {
        
adv_vault_set_field(g_iVaultg_iCampos[D_PJ], g_szPlayerName[id]);
        
adv_vault_set_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id]);
    }
    
adv_vault_set_field(g_iVaultg_iCampos[D_AUTOLOG], g_iAutoLog[id]);
    
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
}

public 
CargarDatos(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return;
    
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id], charsmax(g_szPassword[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id], charsmax(g_szAdminBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id], charsmax(g_szFechaBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id], charsmax(g_szRazonBan[]));
    
g_iAutoLog[id] = adv_vault_get_field(g_iVaultg_iCampos[D_AUTOLOG]);
}

public 
Bienvenida(id)
{
    
ChatColor(0GREEN"^x04%s^x01 Bienvenido ^x03%s^x01. Eres la cuenta registrada ^x04#%d"g_szPrefixg_szPlayerName[id], adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
    static 
iKeyIndexszPlayerBan[32];
    
adv_vault_find_start(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id], FINDFLAGS_CONTAIN);

    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszPlayerBancharsmax(szPlayerBan));
        
        static 
szFechaBan[21];
        
adv_vault_get_prepare(g_iVault_szPlayerBan);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
containi(szFechaBan[2], "/") != -&& containi(szFechaBan[5], "/") != -1)
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
            
            
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
            
ChatColor(0RED"^x04%s^x01 El usuario (^x03%s^x01) ha sido baneado por coincidencias con otro usuario baneado"g_szPrefixg_szPlayerName[id]);
        }
    }
    
adv_vault_find_closed(g_iVault);
}

public 
DesbanCuentas(task)
{
    static 
iKeyIndexszKeyName[32], szDate[25];
    
get_time("%d/%m/%Y - %H:%M:%S"szDatecharsmax(szDate));
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], szDateFINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszKeyNamecharsmax(szKeyName));
        
        
adv_vault_set_start(g_iVault);
        
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
        
adv_vault_set_end(g_iVault0szKeyName);
        
        
ChatColor(0GREEN"^x04%s^x01 El usuario ^x04%s^x01 no está más baneado y puede volver a jugar"g_szPrefixszKeyName);
    }
    
adv_vault_find_closed(g_iVault);
}

public 
CheckName(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return 
false;
    
    return 
true;
}

stock CheckString(szString[], szCaracter[], iLen)
{
    static 
iSz;
    for (
iSz 0iSz sizeof(g_szCaracteres); iSz++)
    {
        if (
containi(szStringg_szCaracteres[iSz]) != -1)
        {
            
formatex(szCaracteriLen"%s"g_szCaracteres[iSz]);
            return 
PLUGIN_HANDLED;
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

stock szRemove_Quotes(const szStr[], szOut[])
{
    if (!
szStr[1])
    {
        
szOut[0] = EOS;
        return 
0;
    }
    
    
copy(szOutstrlen(szStr)-2szStr[1]);
    
trim(szOut);
    
    static 
iLen;
    
iLen strlen(szOut);
    
    for (new 
0iLeni++)
    {
        if (
szOut[i] == '"')
            return 
0;
    }
    
    return 
iLen;
}

stock StringCount(const szString[], szSeachStr)
{
    static 
iCountiLen;
    
iLen strlen(szString);
    
    for (new 
0<= iLeni++)
    {
        if (
szString[i] == szSeachStr)
            
iCount++;
    }
    
    return 
iCount;


Como hago para permitir todos los caracteres en los nombres de los user? supongo que esta es la parte del code

Código PHP:
/** Arrays strings **/
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre está restringido en este servidor";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
"#",
    
"/",
    
"(",
    
")",
    
"\\",
    
"%",
    
"^""
}; 

No lo quiero hacer yo para no dañar el smaWhatdone
Responder
#2
Yo lo puse asi y me sirvio, le busque la vuelta para q me andara sin eso

Código PHP:
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre está restringido en este servidor";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
    
""
}; 

avisas si te sirvio asi.
No me impresiona nada que mis ojos no puedan ver. Fuck yeah
Responder
#3
Código PHP:
new const g_szCaracteres[][] =
{
    
"#",
    
"/",
    
"(",
    
")",
    
"\\",
    
"%",
    
"^""
}; 
------->
Código PHP:
new const g_szCaracteres[][] =
{
    
"#",
    
"/",
    
"(",
    
")",
    
"\\",
    
"%",
    
"^"
}; 
Responder
#4
Todos los comentarios están mal hechos...
Código PHP:
if (!g_szPassword[id][0] || StringCount(g_szPassword[id], ' ') > 1
>
Código PHP:
if (!g_szPassword[id][0]) 
Prueba haciendo eso.. Seguramente funciona. Y hazlo con las lineas que encuentres igual

Con respecto a los comentarios, no deben tocar la constante g_szCaracteres porque influye en la mayoría del código y evita colisiones y bugs de label y exploits (Si es que se soluciona).

Lo único que tienes que hacer es lo que te puse arriba..

PD: Los caracteres son importantes para bloquear, pero es tu elección.
Lo que debería estar puesto son las comillas (^", % y #) después es tu elección..
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#5
(13/04/2015, 11:36 PM)CSAxel escribió: Todos los comentarios están mal hechos...
Código PHP:
if (!g_szPassword[id][0] || StringCount(g_szPassword[id], ' ') > 1
>
Código PHP:
if (!g_szPassword[id][0]) 
Prueba haciendo eso.. Seguramente funciona. Y hazlo con las lineas que encuentres igual

Con respecto a los comentarios, no deben tocar la constante g_szCaracteres porque influye en la mayoría del código y evita colisiones y bugs de label y exploits (Si es que se soluciona).

Lo único que tienes que hacer es lo que te puse arriba..

PD: Los caracteres son importantes para bloquear, pero es tu elección.
Lo que debería estar puesto son las comillas (^", % y #) después es tu elección..


Funciono perfecto! pero a los usuarios no les guarda los ammo pack, cada vez que se cambia el mapa se borran, debería de guardar cuando gana y cuando se desconecta no?
Responder
#6
El guardado ya está implementado para que guarde de cualquier forma, capaz tienes algo mal hecho cuando agregas para guardad los AmmoPacks
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#7
(14/04/2015, 12:40 AM)CSAxel escribió: El guardado ya está implementado para que guarde de cualquier forma, capaz tienes algo mal hecho cuando agregas para guardad los AmmoPacks


Actualmente así está el sma, lo único que modifique fue esta parte por otros caracteres:
Código PHP:
/** Arrays strings **/
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre contiene algun caracter no permitido, debes cambiarte el nombre.";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
"š",
    
"ž",
    
"ð",
    
"Ï",
    
"ÿ",
    
"Â",
    
"ë"
}; 

Este es el sma y esta tal cual como lo descargue y no guarda los ammos.

Código PHP:
/** Versión del Plugin **/
new const g_szPluginVersion[] = "v2.0 BETA";

/**

Publicación: https://amxmodx-es.com/Thread-Sistema-de-Cuentas-por-adv-vault

Créditos:
    - kikizon2: Por su sistema de cuentas también hecho por adv_vault. Me inspiró a que yo haga uno nuevo más dinámico y más cosas.
    - Destro: Por su sistema API de guardado Advance Vault System
    - Metrikcz: Por su Aporte: https://amxmodx-es.com/Thread-CODIGO-Buscador-de-jugadores-Adv-Vault
    - Mario.AR: Por su código de mejorar el remuevo de comillas
    - Gonza.-*: Por su stock para Chequear un caracter inválido

Changelog (Cambios producidos)
 - v2.0
    - Se arregló un error en el comando amx_bancuentas que se cancelaba la restricción al comando (Es decir que lo podía usar cualquiera)
    - Se optimizaron todos los chequeos (Condiciones)
    - Se eliminaron aquellos chequeos innecesarios
    - Se agregaron chequeos adicionales para evitar errores de tipeo
    - Se arregló un error con la obtención de la fecha sobre los usuarios baneados
    - Se agregó un nuevo stock: StringCount();
    - Se agregó nuevamente las restricciones al menú OldStyle (Gracias FierroCross)
    - client_infochanged(); --> FM_ClientUserInfoChanged
    - Agregado Callbacks a los menús
    - Se agregaron comentarios para entender más las funciones y demases
    - Se modificó la mayoría del código para un mejor uso
 - v1.5
    - Se cambió la estructura del Sistema
    - Se corrigió un mega BUG que crasheaba el CS con el Auto-ban
    - Se corrigió un mega BUG que las fechas no coincidian como corresponde
    - Se corrigió un BUG del menú al registrarse
    - Se corrigió un BUG que expulsaba al usuario que dio ban, en vez del al baneado
    - Se removió el comando menuselect para menú de estilo viejo (Se recomienda usar el estilo VGUI)
    - Se eliminó bastante código innecesario
    - Se agregaron menús y otras cosas eficientes
    - Se agrego la hora al momento de banear
 - v1.4
    - Se corrigieron varios bugs que se encontraron al probar el Sistema más profundamente
    - Se agrego un sistema de ban automático (Se explica en la parte de contenido)
 - v1.3
    - Se agregó un mejor sistema de restricción de caracteres
    - Se agregó un stock para remover las comillas con más facilidad (Gracias Mario.AR)
    - Se agregó un menú de confirmación de ban (Si acepta, lo banea instantaneamente, sino, vuelve al menú de ban)
    - Se arregló un problema con el auto-ingreso
    - Se arregló un problema con el guardado de datos y cargado de los mismos
    - Se mejoró el guardado de IP y el ingreso automático por su medio
    - Se mejoró el sistema de ban / desban de cuentas
    - Se mejoraron las variables booleanas (Utilizando Bitsums)
    - Se optimizó el programa para mayor utilidad
 - v1.2
   - Se agregó un sistema de cambio de contraseña (A través de un comando)
   - Se agregó en el menú de Ban de cuenta, un Sub-menú que te muestra el listado de exclusiones realizadas.
   - Se optimizó el programa y removido algunos comandos innecesarios
   - Se corrigieron algunos errores en el guardado
   - Se corrigió un error en la función de desbaneo de cuentas (A través del tiempo)
   - Se corrigieron algunas faltas de ortografía :S
 - v1.1:
   - Se agrego la restricción de caracteres especiales sobre los Nombres y contraseñas.
   - Se agregó el Fix Label para el registro de nombres.
   - Se arreglaron errores menores.
 - v1.0: Lanzamiento del programa.

**/

/** Librerías **/
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <adv_vault>
#include <colorchat>
#include <hamsandwich>

/** Datos del Plugin **/
new const g_szPluginName[] = "Sistema de Cuentas";
new const 
g_szPluginAuthor[] = "CSAxel (Rubio.-)";
new const 
g_szPluginCvar[] = "sys_version";

#pragma semicolon 1

/** Enumeraciones **/
enum
{
    
D_PJ 0,
    
D_PASSWORD,
    
D_IP,
    
D_ADMINBAN,
    
D_FECHABAN,
    
D_FECHAVEN,
    
D_RAZONBAN,
    
D_AUTOLOG,
    
    
MAX_DATOS
};

/** Arrays strings **/
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre contiene algun caracter no permitido, debes cambiarte el nombre.";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
"š",
    
"ž",
    
"ð",
    
"Ï",
    
"ÿ",
    
"Â",
    
"ë"
};

/** Variables del jugador (Bits) **/
new g_bConnected;
new 
g_bBanned;
new 
g_bLogged;
new 
g_bChangePass;

/** Variables del jugador (Ints) **/
new g_iTypeBan[33];
new 
g_iAutoLog[33];

/** Variables del jugador (String) **/
new g_szPlayerName[33][32];
new 
g_szPassword[33][34];
new 
g_szPlayerIP[33][21];
new 
g_szFechaBan[33][20];
new 
g_szFechaVen[33][20];
new 
g_szAdminBan[33][32];
new 
g_szRazonBan[33][64];

/** Variables Globales (Strings) **/
new g_szSimbol[2];
new 
g_szPlayerName_Ban[32];

/** Variables globales (Ints) **/
new g_iVault;
new 
g_iMenuCB;
new 
g_iCampos[MAX_DATOS];
new 
g_iMaxPlayers[1 char];

/** Variables globales (MsgID) **/
new g_iMsgID_ShowMenu;
new 
g_iMsgID_VGUIMenu;

/** HamHook **/
new HamHook:g_iHam_PreThink;

/** Constantes **/
const TASK_DESBAN 21050;
const 
OFFSET_MENU 205;
const 
OFFSET_VGUI_MENU 2;
const 
ADMIN_ACCESS_MENU ADMIN_RCON;
const 
TIME_DESBAN 600;

/** Inicio del Plugin **/
public plugin_init()
{
    
/** Datos del plugin **/
    
register_plugin(g_szPluginNameg_szPluginVersiong_szPluginAuthor);
    
register_cvar(g_szPluginCvarg_szPluginVersionFCVAR_SERVER FCVAR_SPONLY);
    
set_cvar_string(g_szPluginCvarg_szPluginVersion);
    
    
/** Ham Forwards **/
    
DisableHamForward(g_iHam_PreThink RegisterHam(Ham_Player_PreThink"player""Ham_PlayerPreThink_Post"true));
    
    
/** Fakemeta Forwards **/
    
register_forward(FM_ClientUserInfoChanged"Fwd_ClientChangeName");
    
register_forward(FM_ChangeLevel"Fwd_ChangeLevel");
    
    
/** Messages ID **/
    
g_iMsgID_ShowMenu get_user_msgid("ShowMenu");
    
g_iMsgID_VGUIMenu get_user_msgid("VGUIMenu");
    
register_message(g_iMsgID_ShowMenu"Message_ShowMenu");
    
register_message(g_iMsgID_VGUIMenu"Message_VGUIMenu");
    
    
/** Comandos de consola (Cliente) **/
    
register_concmd("amx_bancuentas""ConCmd_BanCuentas"ADMIN_ACCESS_MENU);
    
    
/** Comandos del cliente **/
    
register_clcmd("say /configs""Clcmd_ShowConfig");
    
    
register_clcmd("CREATE_PASSWORD""Clcmd_CreatePw");
    
register_clcmd("CONFIRM_PASSWORD""Clcmd_ConfirmPw");
    
register_clcmd("IDENTIFLY_PASSWORD""Clcmd_IdentiflyPw");
    
register_clcmd("CURRENT_PASSWORD""Clcmd_CurrentPw");
    
register_clcmd("INSERT_USERNAME""Clcmd_InsertUsername");
    
register_clcmd("INSERT_DATE""Clcmd_InsertDate");
    
register_clcmd("INSERT_REASON""Clcmd_InsertReason");
    
    
/** Comandos del servidor **/
    
register_clcmd("chooseteam""Clcmd_ChangeTeam");
    
register_clcmd("jointeam""Clcmd_ChangeTeam");
    
register_clcmd("menuselect""Clcmd_MenuSelect");
    
    
/** MaxPlayers y Callbacks **/
    
g_iMaxPlayers{0} = get_maxplayers();
    
g_iMenuCB menu_makecallback("CM_Register");
    
    
/** Creación de la DB **/
    
g_iVault adv_vault_open("DB_Cuentas"false);
    
g_iCampos[D_PJ] = adv_vault_register_field(g_iVault"PJ"DATATYPE_STRINGsizeof(g_szPlayerName[]));
    
g_iCampos[D_PASSWORD] = adv_vault_register_field(g_iVault"Password"DATATYPE_STRINGsizeof(g_szPassword[]));
    
g_iCampos[D_IP] = adv_vault_register_field(g_iVault"IP"DATATYPE_STRINGsizeof(g_szPlayerIP[]));
    
g_iCampos[D_ADMINBAN] = adv_vault_register_field(g_iVault"AdminBAN"DATATYPE_STRINGsizeof(g_szAdminBan[]));
    
g_iCampos[D_FECHABAN] = adv_vault_register_field(g_iVault"FechaBAN"DATATYPE_STRINGsizeof(g_szFechaBan[]));
    
g_iCampos[D_FECHAVEN] = adv_vault_register_field(g_iVault"FechaVEN"DATATYPE_STRINGsizeof(g_szFechaVen[]));
    
g_iCampos[D_RAZONBAN] = adv_vault_register_field(g_iVault"RazonBAN"DATATYPE_STRINGsizeof(g_szRazonBan[]));
    
g_iCampos[D_AUTOLOG] = adv_vault_register_field(g_iVault"AutoLog");
    
adv_vault_init(g_iVault);
    
    
/** Ciclo/Chequeo de cuentas baneadas **/
    
set_task(float(TIME_DESBAN), "DesbanCuentas"TASK_DESBAN, .flags "b");
}

/** AmxMod Forwards **/
public client_putinserver(id)
{
    
get_user_name(idg_szPlayerName[id], charsmax(g_szPlayerName[]));
    
get_user_ip(idg_szPlayerIP[id], charsmax(g_szPlayerIP[]));
    
    if (
CheckString(g_szPlayerName[id], g_szSimbolcharsmax(g_szSimbol)))
    {
        
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage1);
        return;
    }
    
    
g_szPassword[id][0] = '^0';
    
g_szAdminBan[id][0] = '^0';
    
g_szFechaBan[id][0] = '^0';
    
g_szFechaVen[id][0] = '^0';
    
g_szRazonBan[id][0] = '^0';
    
    
g_bConnected |= (1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
    
g_iTypeBan[id] = 0;
    
g_iAutoLog[id] = 0;
    
    
CargarDatos(id);
}

public 
client_disconnect(id)
{
    if (
g_bLogged & (1<<(id 1)) && ~g_bBanned & (1<<(id 1)))
        
GuardarDatos(id0);
    
    
g_bConnected &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
}

/** Ham Forwards **/
public Ham_PlayerPreThink_Post(id)
{
    
set_pdata_int(idOFFSET_MENU0);
    
DisableHamForward(g_iHam_PreThink);
}

/** Fakemeta Forwards **/
public Fwd_ClientChangeName(id)
{
    if (~
g_bConnected & (1<<(id 1)))
        return 
FMRES_IGNORED;
    
    static 
szCurrentName[32];
    
get_user_info(id"name"szCurrentNamecharsmax(szCurrentName));
    
    if (
equal(szCurrentNameg_szPlayerName[id]))
        return 
FMRES_IGNORED;
    
    
set_user_info(id"name"g_szPlayerName[id]);
    return 
FMRES_SUPERCEDE;
}

public 
Fwd_ChangeLevel()
{
    static 
id;
    for (
id 1id <= g_iMaxPlayers{0}; id++)
    {
        if (~
g_bConnected & (1<<(id 1)))
            continue;
        
        if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
            continue;
        
        
GuardarDatos(id0);
    }
    
    return 
FMRES_IGNORED;
}

/** Comandos de consola (Cliente) **/
public ConCmd_BanCuentas(idiLevel)
{
    if (~
get_user_flags(id) & iLevel)
        return 
PLUGIN_HANDLED;
    
    
SM_BanMenu(id);
    return 
PLUGIN_HANDLED;
}

/** Comandos del cliente **/
public Clcmd_ShowConfig(id)
{
    if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
        return 
PLUGIN_HANDLED;
    
    
SM_Configs(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_CreatePw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    if (!
g_szPassword[id][0] || StringCount(g_szPassword[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene espacios. Inténtalo nuevamente"g_szPrefix);
        return;
    }
    
    if (
CheckString(g_szPassword[id], g_szSimbolcharsmax(g_szSimbol)))
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene un caracter inválido ^x04(^x01%s^x04)"g_szPrefixg_szSimbol);
        return;
    }
    
    
client_cmd(id"messagemode ^"CONFIRM_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Para completar tu registro... Repite tu contraseña"g_szPrefix);
}

public 
Clcmd_ConfirmPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    if (!
equal(szPasswordg_szPassword[id]))
    {
        
SM_Register(id);
        
ChatColor(idRED"^x04%s^x03 Las contraseñas no coinciden... Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id0);
    if (
g_bChangePass & (1<<(id 1)))
    {
        
SM_Configs(id);
        
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido cambiada correctamente."g_szPrefix);
        return;
    }
        
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
    
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido creada correctamente."g_szPrefix);
    
set_task(1.0"Bienvenida"id);
}

public 
Clcmd_IdentiflyPw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szBufferg_szPassword[id]))
    {
        
client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id1);
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
}

public 
Clcmd_CurrentPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szPasswordszBuffer))
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
g_bChangePass |= (1<<(id 1));
    
g_szPassword[id][0] = '^0';
    
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Contraseña correcta... Para completar tu registro escribe tu nueva contraseña."g_szPrefix);
}

public 
Clcmd_InsertUsername(id)
{
    static 
szName[32];
    
read_args(szNamecharsmax(szName));
    
szRemove_Quotes(szNameszName);
    
trim(szName);
    
    if (!
szName[0] || StringCount(szName' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        
ChatColor(idRED"^x04%s^x03 El nombre no contiene espacios. Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
SM_FindPlayer(idszName);
    
formatex(g_szAdminBan[id], charsmax(g_szAdminBan[]), g_szPlayerName[id]);
}

public 
Clcmd_InsertDate(id)
{
    
read_args(g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
szRemove_Quotes(g_szFechaVen[id], g_szFechaVen[id]);
    
trim(g_szFechaVen[id]);
    
    if (!
g_szFechaVen[id][0] || StringCount(g_szFechaVen[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idRED"^x04%s^x03 La fecha no contiene espacios. Inténtalo nuevamente o más tarde"g_szPrefix);
        return;
    }
    
    static 
szHora[10];
    
get_time("%H:%M:%S"szHoracharsmax(szHora));
    
format(g_szFechaVen[id], charsmax(g_szFechaVen[]), "%s - %s"g_szFechaVen[id], szHora);
    
    
client_cmd(id"messagemode ^"INSERT_REASON^"");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa la razón sobre el ban del jugador."g_szPrefix);
}

public 
Clcmd_InsertReason(id)
{
    
read_args(g_szRazonBan[id], charsmax(g_szRazonBan[]));
    
szRemove_Quotes(g_szRazonBan[id], g_szRazonBan[id]);
    
trim(g_szRazonBan[id]);
    
    if (!
g_szRazonBan[id][0] || StringCount(g_szRazonBan[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_REASON^"");
        
ChatColor(idRED"^x04%s^x03 La razón no contiene espacios. Inténtalo nuevament"g_szPrefix);
        return;
    }
    
    static 
iMenuszText[156];
    
iMenu menu_create("¿ Confirmar ?""HandlerMenu_Confirmar");
    
    
menu_additem(iMenu"Si, banear ahora");
    
menu_additem(iMenu"No, reescribir datos");
    
    
menu_addblank(iMenu0);
    
formatex(szTextcharsmax(szText), "\yJugador\r: \w%s^n\
                        \yFecha de vencimiento\r: \w%s^n\
                        \yRazón del ban\r: \w%s"

    
g_szPlayerName_Bang_szFechaVen[id], g_szRazonBan[id]);
    
menu_addtext(iMenuszText0);
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

/** Comandos del servidor **/
public Clcmd_ChangeTeam(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    
SM_Register(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_MenuSelect(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    static 
szArgs[2], iKey;
    
read_argv(1szArgscharsmax(szArgs));
    
iKey = (str_to_num(szArgs) - 1);
    
    switch (
iKey)
    {
        case 
0client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        case 
1client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        default:
        {
            
SM_Register(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

/** ShowMenus **/
SM_Register(id)
{
    static 
iMenuszText[256];
    
formatex(szTextcharsmax(szText), "Bienvenido a nuestro servidor con \r%s"g_szPluginName);
    
iMenu menu_create(szText"HM_Register");
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_additem(iMenu"Salir del servidor^n");
        
        
formatex(szTextcharsmax(szText), "\yTU CUENTA ESTA BANEADA\r:^n\
        \yAdministrador\r:\w %s^n\
        \yFecha de ban\r:\w %s^n\
        \yFecha de Vencimiento\r:\w %s^n\
        \yRazón\r:\w %s"
g_szAdminBan[id], g_szFechaBan[id], g_szFechaVen[id], g_szRazonBan[id]);
        
menu_addtext(iMenuszText0);
    }
    else
    {
        
menu_additem(iMenu"Crear nueva cuenta", .callback g_iMenuCB);
        
menu_additem(iMenu"Identificarse", .callback g_iMenuCB);
    }
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

SM_BanMenu(id)
{
    static 
iMenuszText[18];
    
iMenu menu_create("Ban de cuentas""HM_BanMenu");
    
    
menu_additem(iMenu"Buscar jugador...");
    
formatex(szTextcharsmax(szText), "Acción: %s^n"g_iTypeBan[id] ? "\rDesbanear" "\yBanear");
    
menu_additem(iMenuszText);
    
    
menu_additem(iMenu"Lista de jugadores excluidos");
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_FindPlayer(idszName[])
{
    static 
iKeyIndexiResultadosiMenuszKeyIndex[2], szText[64];
    
formatex(szTextcharsmax(szText), "\yNombres que contengan\r: \w%s\r\R"szName);
    
iMenu menu_create(szText"HM_FindPlayer");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_PJ], szNameFINDFLAGS_CONTAIN|FINDFLAGS_CASE_SENSITIVE);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_PJ], szTextcharsmax(szText));
        
num_to_str(iKeyIndexszKeyIndexcharsmax(szKeyIndex));
        
menu_additem(iMenuszTextszKeyIndex);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"Iniciar nueva busqueda""0");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_PlayerList(id)
{
    static 
iMenuiKeyIndexiResultadosszName[32], szFecha[12], szText[64];
    
iMenu menu_create("Lista de jugadores excluidos\r\R""HM_PlayerList");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], "/"FINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechacharsmax(szFecha));
        
adv_vault_get_keyname(g_iVaultiKeyIndexszNamecharsmax(szName));
        
formatex(szTextcharsmax(szText), "\w%s \r- \yFecha\r: \w%s"szNameszFecha);
        
menu_additem(iMenuszText);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"No se encontraron usuarios baneados");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_Configs(id)
{
    static 
iMenuszText[52];
    
iMenu menu_create("Configurar mi cuenta""HM_Configs");
    
    
menu_additem(iMenu"Cambiar mi contraseña");
    
formatex(szTextcharsmax(szText), "¿ Recordar mi cuenta ? %s^n^n\
    \yCUENTA\r: \w#%d"
g_iAutoLog[id] ? "\y[Si]" "\r[No]"adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
menu_additem(iMenuszText);
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

/** Callbacks Menus **/
public CM_Register(idiMenuiItem)
{
    if (!
CheckName(id) && !iItem)
        return 
ITEM_ENABLED;
    else if (
CheckName(id) && iItem)
        return 
ITEM_ENABLED;
    
    return 
ITEM_DISABLED;
}

/** Handlers Menus **/
public HM_Register(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_destroy(iMenu);
        
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
client_cmd(id"messagemode ^"%s^""iItem "IDENTIFLY_PASSWORD" "CREATE_PASSWORD");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

public 
HM_BanMenu(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    switch (
iItem)
    {
        case 
0
        {
            
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
            
ChatColor(idBLUE"^x04%s^x03 Ingresa el nombre del jugador ^x04(^x01Puede ser una parte de él^x04)^x01."g_szPrefix);
        }
        case 
1
        {
            
g_iTypeBan[id] = !(g_iTypeBan[id]);
            
SM_BanMenu(id);
        }
        case 
2SM_PlayerList(id);
    }
    
    return 
PLUGIN_HANDLED;
}

public 
HM_FindPlayer(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
        
SM_BanMenu(id);
        
g_szAdminBan[id][0] = '^0';
        return 
PLUGIN_HANDLED;
    }
    
    static 
iGetInfoszItem[2], szName[32], iKeyIndex;
    
menu_item_getinfo(iMenuiItemiGetInfoszItemcharsmax(szItem), szNamecharsmax(szName), iGetInfo);
    
iKeyIndex str_to_num(szItem);
    
    if (!
iKeyIndex)
    {
        
menu_destroy(iMenu);
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        return 
PLUGIN_HANDLED;
    }
    
    
formatex(g_szPlayerName_Bancharsmax(g_szPlayerName_Ban), szName);
    
    if (
g_iTypeBan[id])
        
ShowBanPlayer(id1);
    else
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa la fecha de vencimiento"g_szPrefix);
        
ChatColor(idBLUE"^x04%s^x03 Formato de fecha:^x01 MES / DÍA / AÑO ^x04(Dos últimos dígitos)."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_PlayerList(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
SM_BanMenu(id);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
SM_PlayerList(id);
    return 
PLUGIN_HANDLED;
}

public 
HandlerMenu_Confirmar(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (!
iItem)
        
ShowBanPlayer(id0);
    else
        
SM_BanMenu(id);
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_Configs(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
iItem)
    {
        
g_iAutoLog[id] = !(g_iAutoLog[id]);
        
SM_Configs(id);
    }
    else
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña actual para continuar."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
Message_ShowMenu(iMsgIDiDestiEntity)
{
    static 
szMenuCode[32];
    
get_msg_arg_string(4szMenuCodecharsmax(szMenuCode));
    
    if (
contain(szMenuCode"#Team") == -1)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);    
    
EnableHamForward(g_iHam_PreThink);
    return 
PLUGIN_HANDLED;
}

public 
Message_VGUIMenu(iMsgIDiDestiEntity)
{
    if (
get_msg_arg_int(1) != OFFSET_VGUI_MENU)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);
    return 
PLUGIN_HANDLED;
}

public 
CheckUser(id)
{
    if (~
g_bLogged & (1<<(id 1)))
    {
        static 
szFechaBan[15], szPlayerIP[21];
        
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
strlen(szFechaBan) > 3)
            
g_bBanned |= (1<<(id 1));
        else
        {
            
adv_vault_get_field(g_iVaultg_iCampos[D_IP], szPlayerIPcharsmax(szPlayerIP));
            if (
g_iAutoLog[id] && equal(szPlayerIPg_szPlayerIP[id]))
            {
                
g_bLogged |= (1<<(id 1));
                
engclient_cmd(id"chooseteam");
                return;
            }
        }
        
        
SM_Register(id);
    }
}

public 
ShowBanPlayer(idiTypeBan)
{
    switch (
iTypeBan)
    {
        case 
0:
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
server_cmd("kick ^"%s^" ^"%s^""g_szPlayerName_Bang_szMessage2);
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 baneó la cuenta de ^x04%s^x03 -^x01 Fecha de vencimiento: ^x04%s"g_szPrefixg_szAdminBan[id], g_szPlayerName_Bang_szFechaVen[id]);
            
ChatColor(0GREEN"^x04%s^x01 Razón de ban:^x04 %s"g_szPrefixg_szRazonBan[id]);
        }
        case 
1:
        {
            static 
szFechaBan[21];
            
adv_vault_get_prepare(g_iVault_g_szPlayerName_Ban);
            
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
            
            if (
containi(szFechaBan[2], "") != -&& containi(szFechaBan[5], "") != -1)
            {
                
ChatColor(idGREEN"^x04%s^x01 El jugador que intentas desbanear, no está baneado en el servidor."g_szPrefix);
                return;
            }
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 desbaneó la cuenta de ^x04%s"g_szPrefixg_szPlayerName[id], g_szPlayerName_Ban);
        }
    }
}

public 
GuardarDatos(idisIP)
{
    
adv_vault_set_start(g_iVault);
    if (
isIP)
        
adv_vault_set_field(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id]);
    else
    {
        
adv_vault_set_field(g_iVaultg_iCampos[D_PJ], g_szPlayerName[id]);
        
adv_vault_set_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id]);
    }
    
adv_vault_set_field(g_iVaultg_iCampos[D_AUTOLOG], g_iAutoLog[id]);
    
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
}

public 
CargarDatos(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return;
    
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id], charsmax(g_szPassword[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id], charsmax(g_szAdminBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id], charsmax(g_szFechaBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id], charsmax(g_szRazonBan[]));
    
g_iAutoLog[id] = adv_vault_get_field(g_iVaultg_iCampos[D_AUTOLOG]);
}

public 
Bienvenida(id)
{
    
ChatColor(0GREEN"^x04%s^x01 Bienvenido ^x03%s^x01. Eres la cuenta registrada ^x04#%d"g_szPrefixg_szPlayerName[id], adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
    static 
iKeyIndexszPlayerBan[32];
    
adv_vault_find_start(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id], FINDFLAGS_CONTAIN);

    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszPlayerBancharsmax(szPlayerBan));
        
        static 
szFechaBan[21];
        
adv_vault_get_prepare(g_iVault_szPlayerBan);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
containi(szFechaBan[2], "/") != -&& containi(szFechaBan[5], "/") != -1)
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
            
            
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
            
ChatColor(0RED"^x04%s^x01 El usuario (^x03%s^x01) ha sido baneado por coincidencias con otro usuario baneado"g_szPrefixg_szPlayerName[id]);
        }
    }
    
adv_vault_find_closed(g_iVault);
}

public 
DesbanCuentas(task)
{
    static 
iKeyIndexszKeyName[32], szDate[25];
    
get_time("%d/%m/%Y - %H:%M:%S"szDatecharsmax(szDate));
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], szDateFINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszKeyNamecharsmax(szKeyName));
        
        
adv_vault_set_start(g_iVault);
        
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
        
adv_vault_set_end(g_iVault0szKeyName);
        
        
ChatColor(0GREEN"^x04%s^x01 El usuario ^x04%s^x01 no está más baneado y puede volver a jugar"g_szPrefixszKeyName);
    }
    
adv_vault_find_closed(g_iVault);
}

public 
CheckName(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return 
false;
    
    return 
true;
}

stock CheckString(szString[], szCaracter[], iLen)
{
    static 
iSz;
    for (
iSz 0iSz sizeof(g_szCaracteres); iSz++)
    {
        if (
containi(szStringg_szCaracteres[iSz]) != -1)
        {
            
formatex(szCaracteriLen"%s"g_szCaracteres[iSz]);
            return 
PLUGIN_HANDLED;
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

stock szRemove_Quotes(const szStr[], szOut[])
{
    if (!
szStr[1])
    {
        
szOut[0] = EOS;
        return 
0;
    }
    
    
copy(szOutstrlen(szStr)-2szStr[1]);
    
trim(szOut);
    
    static 
iLen;
    
iLen strlen(szOut);
    
    for (new 
0iLeni++)
    {
        if (
szOut[i] == '"')
            return 
0;
    }
    
    return 
iLen;
}

stock StringCount(const szString[], szSeachStr)
{
    static 
iCountiLen;
    
iLen strlen(szString);
    
    for (new 
0<= iLeni++)
    {
        if (
szString[i] == szSeachStr)
            
iCount++;
    }
    
    return 
iCount;

Responder
#8
Lo de los caracteres ponlo como estaba, por algo los puse Are you fucking kidding me?
Con respecto a los AmmoPacks, no lo guardas directamente, lo tienes que hacer tú mismo para que guarde, mira que no hace todo mágicamente.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#9
(14/04/2015, 12:55 AM)CSAxel escribió: Lo de los caracteres ponlo como estaba, por algo los puse Are you fucking kidding me?
Con respecto a los AmmoPacks, no lo guardas directamente, lo tienes que hacer tú mismo para que guarde, mira que no hace todo mágicamente.


lo de los caracteres lo modifique de esa forma para no dañar el sma o tocar algo y se dañara el registro, ya que muchos entran con nombres con caracteres como: /,*,-,# etc ............. y no sabia que tenia que ponerlo para que guarde me puedes decir como hacerlo? no tengo idea de como hacerlo y disculpa tanta molestia enseñame Whatdone
Responder
#10
Yo te recomendaría que los pongas, a los caracteres prohibido los puse porque son restricciones para soluciones con caidas extrañas (Label o Exploits). Y evitar bugs de nombres.
No daña el sistema de cuentas, porque sino, no lo pondría Roflmao

Con respecto a agregar, es una pavada
Código PHP:
/** Agregas una librería (Include) **/
#include <zombieplague> // Acá debería estar la native de los ammopacks

/** Vamos a la enumeración de los campos y agregas esto **/
D_AMMOPACKS

/** Quedaría así **/
enum
{
    
D_PJ 0,
    
D_PASSWORD,
    
D_IP,
    
D_ADMINBAN,
    
D_FECHABAN,
    
D_FECHAVEN,
    
D_RAZONBAN,
    
D_AUTOLOG,
    
D_AMMOPACKS,
    
    
MAX_DATOS
};

/** Ahora registramos el campo para que se guarden los ammopacks **/
/** Vamos a la función plugin_init(); y arriba de adv_vault_init(); agregas **/
g_iCampos[D_AMMOPACKS] = adv_vault_register_field(g_iVault"AmmoPacks");

/** En las funciones de guardar y cargar agregamos para que guarde por ammopacks **(
/** En la parte de guardar (Función: GuardarDatos) agregas arriba de adv_vault_start_end(); **/
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammopacks(id));

/** En la parte de cargar (Función: CargarDatos) agregas abajo del ÚLTIMO adv_vault_get_field(); **/
zp_set_user_ammopacks(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#11
ME SALE ESE ERROR NO ENTIENDO PORQUE :/
[Imagen: 53lhra.jpg]

linea 895:
Código PHP:
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammopacks(id)); 

liena 910
Código PHP:
    zp_set_user_ammopacks(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 

Código PHP:
/** Versión del Plugin **/
new const g_szPluginVersion[] = "v2.0 BETA";

/**

Publicación: https://amxmodx-es.com/Thread-Sistema-de-Cuentas-por-adv-vault

Créditos:
    - kikizon2: Por su sistema de cuentas también hecho por adv_vault. Me inspiró a que yo haga uno nuevo más dinámico y más cosas.
    - Destro: Por su sistema API de guardado Advance Vault System
    - Metrikcz: Por su Aporte: https://amxmodx-es.com/Thread-CODIGO-Buscador-de-jugadores-Adv-Vault
    - Mario.AR: Por su código de mejorar el remuevo de comillas
    - Gonza.-*: Por su stock para Chequear un caracter inválido

Changelog (Cambios producidos)
 - v2.0
    - Se arregló un error en el comando amx_bancuentas que se cancelaba la restricción al comando (Es decir que lo podía usar cualquiera)
    - Se optimizaron todos los chequeos (Condiciones)
    - Se eliminaron aquellos chequeos innecesarios
    - Se agregaron chequeos adicionales para evitar errores de tipeo
    - Se arregló un error con la obtención de la fecha sobre los usuarios baneados
    - Se agregó un nuevo stock: StringCount();
    - Se agregó nuevamente las restricciones al menú OldStyle (Gracias FierroCross)
    - client_infochanged(); --> FM_ClientUserInfoChanged
    - Agregado Callbacks a los menús
    - Se agregaron comentarios para entender más las funciones y demases
    - Se modificó la mayoría del código para un mejor uso
 - v1.5
    - Se cambió la estructura del Sistema
    - Se corrigió un mega BUG que crasheaba el CS con el Auto-ban
    - Se corrigió un mega BUG que las fechas no coincidian como corresponde
    - Se corrigió un BUG del menú al registrarse
    - Se corrigió un BUG que expulsaba al usuario que dio ban, en vez del al baneado
    - Se removió el comando menuselect para menú de estilo viejo (Se recomienda usar el estilo VGUI)
    - Se eliminó bastante código innecesario
    - Se agregaron menús y otras cosas eficientes
    - Se agrego la hora al momento de banear
 - v1.4
    - Se corrigieron varios bugs que se encontraron al probar el Sistema más profundamente
    - Se agrego un sistema de ban automático (Se explica en la parte de contenido)
 - v1.3
    - Se agregó un mejor sistema de restricción de caracteres
    - Se agregó un stock para remover las comillas con más facilidad (Gracias Mario.AR)
    - Se agregó un menú de confirmación de ban (Si acepta, lo banea instantaneamente, sino, vuelve al menú de ban)
    - Se arregló un problema con el auto-ingreso
    - Se arregló un problema con el guardado de datos y cargado de los mismos
    - Se mejoró el guardado de IP y el ingreso automático por su medio
    - Se mejoró el sistema de ban / desban de cuentas
    - Se mejoraron las variables booleanas (Utilizando Bitsums)
    - Se optimizó el programa para mayor utilidad
 - v1.2
   - Se agregó un sistema de cambio de contraseña (A través de un comando)
   - Se agregó en el menú de Ban de cuenta, un Sub-menú que te muestra el listado de exclusiones realizadas.
   - Se optimizó el programa y removido algunos comandos innecesarios
   - Se corrigieron algunos errores en el guardado
   - Se corrigió un error en la función de desbaneo de cuentas (A través del tiempo)
   - Se corrigieron algunas faltas de ortografía :S
 - v1.1:
   - Se agrego la restricción de caracteres especiales sobre los Nombres y contraseñas.
   - Se agregó el Fix Label para el registro de nombres.
   - Se arreglaron errores menores.
 - v1.0: Lanzamiento del programa.

**/

/** Librerías **/
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <adv_vault>
#include <colorchat>
#include <hamsandwich>
#include <zombieplague>

/** Datos del Plugin **/
new const g_szPluginName[] = "Sistema de Cuentas";
new const 
g_szPluginAuthor[] = "CSAxel (Rubio.-)";
new const 
g_szPluginCvar[] = "sys_version";

#pragma semicolon 1

/** Enumeraciones **/
enum
{
    
D_PJ 0,
    
D_PASSWORD,
    
D_IP,
    
D_ADMINBAN,
    
D_FECHABAN,
    
D_FECHAVEN,
    
D_RAZONBAN,
    
D_AUTOLOG,
    
D_AMMOPACKS,
    
    
MAX_DATOS
};

/** Arrays strings **/
new const g_szPrefix[] = "[AMXX]";
new const 
g_szMessage1[] = "Tu nombre contiene algun caracter no permitido, debes cambiarte el nombre.";
new const 
g_szMessage2[] = "Vuelve cuando no estés baneado";
new const 
g_szCaracteres[][] =
{
    
"Å¡",
    
"ž",
    
"ð",
    
"Ï",
    
"ÿ",
    
"Â",
    
"ë"
};

/** Variables del jugador (Bits) **/
new g_bConnected;
new 
g_bBanned;
new 
g_bLogged;
new 
g_bChangePass;

/** Variables del jugador (Ints) **/
new g_iTypeBan[33];
new 
g_iAutoLog[33];

/** Variables del jugador (String) **/
new g_szPlayerName[33][32];
new 
g_szPassword[33][34];
new 
g_szPlayerIP[33][21];
new 
g_szFechaBan[33][20];
new 
g_szFechaVen[33][20];
new 
g_szAdminBan[33][32];
new 
g_szRazonBan[33][64];

/** Variables Globales (Strings) **/
new g_szSimbol[2];
new 
g_szPlayerName_Ban[32];

/** Variables globales (Ints) **/
new g_iVault;
new 
g_iMenuCB;
new 
g_iCampos[MAX_DATOS];
new 
g_iMaxPlayers[1 char];

/** Variables globales (MsgID) **/
new g_iMsgID_ShowMenu;
new 
g_iMsgID_VGUIMenu;

/** HamHook **/
new HamHook:g_iHam_PreThink;

/** Constantes **/
const TASK_DESBAN 21050;
const 
OFFSET_MENU 205;
const 
OFFSET_VGUI_MENU 2;
const 
ADMIN_ACCESS_MENU ADMIN_RCON;
const 
TIME_DESBAN 600;

/** Inicio del Plugin **/
public plugin_init()
{
    
/** Datos del plugin **/
    
register_plugin(g_szPluginNameg_szPluginVersiong_szPluginAuthor);
    
register_cvar(g_szPluginCvarg_szPluginVersionFCVAR_SERVER FCVAR_SPONLY);
    
set_cvar_string(g_szPluginCvarg_szPluginVersion);
    
    
/** Ham Forwards **/
    
DisableHamForward(g_iHam_PreThink RegisterHam(Ham_Player_PreThink"player""Ham_PlayerPreThink_Post"true));
    
    
/** Fakemeta Forwards **/
    
register_forward(FM_ClientUserInfoChanged"Fwd_ClientChangeName");
    
register_forward(FM_ChangeLevel"Fwd_ChangeLevel");
    
    
/** Messages ID **/
    
g_iMsgID_ShowMenu get_user_msgid("ShowMenu");
    
g_iMsgID_VGUIMenu get_user_msgid("VGUIMenu");
    
register_message(g_iMsgID_ShowMenu"Message_ShowMenu");
    
register_message(g_iMsgID_VGUIMenu"Message_VGUIMenu");
    
    
/** Comandos de consola (Cliente) **/
    
register_concmd("amx_bancuentas""ConCmd_BanCuentas"ADMIN_ACCESS_MENU);
    
    
/** Comandos del cliente **/
    
register_clcmd("say /configs""Clcmd_ShowConfig");
    
    
register_clcmd("CREATE_PASSWORD""Clcmd_CreatePw");
    
register_clcmd("CONFIRM_PASSWORD""Clcmd_ConfirmPw");
    
register_clcmd("IDENTIFLY_PASSWORD""Clcmd_IdentiflyPw");
    
register_clcmd("CURRENT_PASSWORD""Clcmd_CurrentPw");
    
register_clcmd("INSERT_USERNAME""Clcmd_InsertUsername");
    
register_clcmd("INSERT_DATE""Clcmd_InsertDate");
    
register_clcmd("INSERT_REASON""Clcmd_InsertReason");
    
    
/** Comandos del servidor **/
    
register_clcmd("chooseteam""Clcmd_ChangeTeam");
    
register_clcmd("jointeam""Clcmd_ChangeTeam");
    
register_clcmd("menuselect""Clcmd_MenuSelect");
    
    
/** MaxPlayers y Callbacks **/
    
g_iMaxPlayers{0} = get_maxplayers();
    
g_iMenuCB menu_makecallback("CM_Register");
    
    
/** Creación de la DB **/
    
g_iVault adv_vault_open("DB_Cuentas"false);
    
g_iCampos[D_PJ] = adv_vault_register_field(g_iVault"PJ"DATATYPE_STRINGsizeof(g_szPlayerName[]));
    
g_iCampos[D_PASSWORD] = adv_vault_register_field(g_iVault"Password"DATATYPE_STRINGsizeof(g_szPassword[]));
    
g_iCampos[D_IP] = adv_vault_register_field(g_iVault"IP"DATATYPE_STRINGsizeof(g_szPlayerIP[]));
    
g_iCampos[D_ADMINBAN] = adv_vault_register_field(g_iVault"AdminBAN"DATATYPE_STRINGsizeof(g_szAdminBan[]));
    
g_iCampos[D_FECHABAN] = adv_vault_register_field(g_iVault"FechaBAN"DATATYPE_STRINGsizeof(g_szFechaBan[]));
    
g_iCampos[D_FECHAVEN] = adv_vault_register_field(g_iVault"FechaVEN"DATATYPE_STRINGsizeof(g_szFechaVen[]));
    
g_iCampos[D_RAZONBAN] = adv_vault_register_field(g_iVault"RazonBAN"DATATYPE_STRINGsizeof(g_szRazonBan[]));
    
g_iCampos[D_AUTOLOG] = adv_vault_register_field(g_iVault"AutoLog");
    
g_iCampos[D_AMMOPACKS] = adv_vault_register_field(g_iVault"AmmoPacks");
    
adv_vault_init(g_iVault);
    
    
/** Ciclo/Chequeo de cuentas baneadas **/
    
set_task(float(TIME_DESBAN), "DesbanCuentas"TASK_DESBAN, .flags "b");
}

/** AmxMod Forwards **/
public client_putinserver(id)
{
    
get_user_name(idg_szPlayerName[id], charsmax(g_szPlayerName[]));
    
get_user_ip(idg_szPlayerIP[id], charsmax(g_szPlayerIP[]));
    
    if (
CheckString(g_szPlayerName[id], g_szSimbolcharsmax(g_szSimbol)))
    {
        
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage1);
        return;
    }
    
    
g_szPassword[id][0] = '^0';
    
g_szAdminBan[id][0] = '^0';
    
g_szFechaBan[id][0] = '^0';
    
g_szFechaVen[id][0] = '^0';
    
g_szRazonBan[id][0] = '^0';
    
    
g_bConnected |= (1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
    
g_iTypeBan[id] = 0;
    
g_iAutoLog[id] = 0;
    
    
CargarDatos(id);
}

public 
client_disconnect(id)
{
    if (
g_bLogged & (1<<(id 1)) && ~g_bBanned & (1<<(id 1)))
        
GuardarDatos(id0);
    
    
g_bConnected &= ~(1<<(id 1));
    
g_bLogged &= ~(1<<(id 1));
    
g_bBanned &= ~(1<<(id 1));
    
g_bChangePass &= ~(1<<(id 1));
}

/** Ham Forwards **/
public Ham_PlayerPreThink_Post(id)
{
    
set_pdata_int(idOFFSET_MENU0);
    
DisableHamForward(g_iHam_PreThink);
}

/** Fakemeta Forwards **/
public Fwd_ClientChangeName(id)
{
    if (~
g_bConnected & (1<<(id 1)))
        return 
FMRES_IGNORED;
    
    static 
szCurrentName[32];
    
get_user_info(id"name"szCurrentNamecharsmax(szCurrentName));
    
    if (
equal(szCurrentNameg_szPlayerName[id]))
        return 
FMRES_IGNORED;
    
    
set_user_info(id"name"g_szPlayerName[id]);
    return 
FMRES_SUPERCEDE;
}

public 
Fwd_ChangeLevel()
{
    static 
id;
    for (
id 1id <= g_iMaxPlayers{0}; id++)
    {
        if (~
g_bConnected & (1<<(id 1)))
            continue;
        
        if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
            continue;
        
        
GuardarDatos(id0);
    }
    
    return 
FMRES_IGNORED;
}

/** Comandos de consola (Cliente) **/
public ConCmd_BanCuentas(idiLevel)
{
    if (~
get_user_flags(id) & iLevel)
        return 
PLUGIN_HANDLED;
    
    
SM_BanMenu(id);
    return 
PLUGIN_HANDLED;
}

/** Comandos del cliente **/
public Clcmd_ShowConfig(id)
{
    if (~
g_bLogged & (1<<(id 1)) || g_bBanned & (1<<(id 1)))
        return 
PLUGIN_HANDLED;
    
    
SM_Configs(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_CreatePw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    if (!
g_szPassword[id][0] || StringCount(g_szPassword[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene espacios. Inténtalo nuevamente"g_szPrefix);
        return;
    }
    
    if (
CheckString(g_szPassword[id], g_szSimbolcharsmax(g_szSimbol)))
    {
        
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Tu contraseña contiene un caracter inválido ^x04(^x01%s^x04)"g_szPrefixg_szSimbol);
        return;
    }
    
    
client_cmd(id"messagemode ^"CONFIRM_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Para completar tu registro... Repite tu contraseña"g_szPrefix);
}

public 
Clcmd_ConfirmPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    if (!
equal(szPasswordg_szPassword[id]))
    {
        
SM_Register(id);
        
ChatColor(idRED"^x04%s^x03 Las contraseñas no coinciden... Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id0);
    if (
g_bChangePass & (1<<(id 1)))
    {
        
SM_Configs(id);
        
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido cambiada correctamente."g_szPrefix);
        return;
    }
        
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
    
ChatColor(idBLUE"^x04%s^x03 Tu contraseña ha sido creada correctamente."g_szPrefix);
    
set_task(1.0"Bienvenida"id);
}

public 
Clcmd_IdentiflyPw(id)
{
    
read_args(g_szPassword[id], charsmax(g_szPassword[]));
    
szRemove_Quotes(g_szPassword[id], g_szPassword[id]);
    
trim(g_szPassword[id]);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szBufferg_szPassword[id]))
    {
        
client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
GuardarDatos(id1);
    
g_bLogged |= (1<<(id 1));
    
engclient_cmd(id"chooseteam");
}

public 
Clcmd_CurrentPw(id)
{
    static 
szPassword[32];
    
read_args(szPasswordcharsmax(szPassword));
    
szRemove_Quotes(szPasswordszPassword);
    
trim(szPassword);
    
    static 
szBuffer[32];
    
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], szBuffercharsmax(szBuffer));
    
    if (!
equal(szPasswordszBuffer))
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idRED"^x04%s^x03 Contraseña incorrecta!."g_szPrefix);
        return;
    }
    
    
g_bChangePass |= (1<<(id 1));
    
g_szPassword[id][0] = '^0';
    
client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
    
ChatColor(idBLUE"^x04%s^x03 Contraseña correcta... Para completar tu registro escribe tu nueva contraseña."g_szPrefix);
}

public 
Clcmd_InsertUsername(id)
{
    static 
szName[32];
    
read_args(szNamecharsmax(szName));
    
szRemove_Quotes(szNameszName);
    
trim(szName);
    
    if (!
szName[0] || StringCount(szName' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        
ChatColor(idRED"^x04%s^x03 El nombre no contiene espacios. Inténtalo nuevamente."g_szPrefix);
        return;
    }
    
    
SM_FindPlayer(idszName);
    
formatex(g_szAdminBan[id], charsmax(g_szAdminBan[]), g_szPlayerName[id]);
}

public 
Clcmd_InsertDate(id)
{
    
read_args(g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
szRemove_Quotes(g_szFechaVen[id], g_szFechaVen[id]);
    
trim(g_szFechaVen[id]);
    
    if (!
g_szFechaVen[id][0] || StringCount(g_szFechaVen[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idRED"^x04%s^x03 La fecha no contiene espacios. Inténtalo nuevamente o más tarde"g_szPrefix);
        return;
    }
    
    static 
szHora[10];
    
get_time("%H:%M:%S"szHoracharsmax(szHora));
    
format(g_szFechaVen[id], charsmax(g_szFechaVen[]), "%s - %s"g_szFechaVen[id], szHora);
    
    
client_cmd(id"messagemode ^"INSERT_REASON^"");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa la razón sobre el ban del jugador."g_szPrefix);
}

public 
Clcmd_InsertReason(id)
{
    
read_args(g_szRazonBan[id], charsmax(g_szRazonBan[]));
    
szRemove_Quotes(g_szRazonBan[id], g_szRazonBan[id]);
    
trim(g_szRazonBan[id]);
    
    if (!
g_szRazonBan[id][0] || StringCount(g_szRazonBan[id], ' ') > 1)
    {
        
client_cmd(id"messagemode ^"INSERT_REASON^"");
        
ChatColor(idRED"^x04%s^x03 La razón no contiene espacios. Inténtalo nuevament"g_szPrefix);
        return;
    }
    
    static 
iMenuszText[156];
    
iMenu menu_create("¿ Confirmar ?""HandlerMenu_Confirmar");
    
    
menu_additem(iMenu"Si, banear ahora");
    
menu_additem(iMenu"No, reescribir datos");
    
    
menu_addblank(iMenu0);
    
formatex(szTextcharsmax(szText), "\yJugador\r: \w%s^n\
                        \yFecha de vencimiento\r: \w%s^n\
                        \yRazón del ban\r: \w%s"

    
g_szPlayerName_Bang_szFechaVen[id], g_szRazonBan[id]);
    
menu_addtext(iMenuszText0);
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

/** Comandos del servidor **/
public Clcmd_ChangeTeam(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    
SM_Register(id);
    return 
PLUGIN_HANDLED;
}

public 
Clcmd_MenuSelect(id)
{
    if (
g_bLogged & (1<<(id 1)))
        return 
PLUGIN_CONTINUE;
    
    static 
szArgs[2], iKey;
    
read_argv(1szArgscharsmax(szArgs));
    
iKey = (str_to_num(szArgs) - 1);
    
    switch (
iKey)
    {
        case 
0client_cmd(id"messagemode ^"CREATE_PASSWORD^"");
        case 
1client_cmd(id"messagemode ^"IDENTIFLY_PASSWORD^"");
        default:
        {
            
SM_Register(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

/** ShowMenus **/
SM_Register(id)
{
    static 
iMenuszText[256];
    
formatex(szTextcharsmax(szText), "Bienvenido a nuestro servidor con \r%s"g_szPluginName);
    
iMenu menu_create(szText"HM_Register");
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_additem(iMenu"Salir del servidor^n");
        
        
formatex(szTextcharsmax(szText), "\yTU CUENTA ESTA BANEADA\r:^n\
        \yAdministrador\r:\w %s^n\
        \yFecha de ban\r:\w %s^n\
        \yFecha de Vencimiento\r:\w %s^n\
        \yRazón\r:\w %s"
g_szAdminBan[id], g_szFechaBan[id], g_szFechaVen[id], g_szRazonBan[id]);
        
menu_addtext(iMenuszText0);
    }
    else
    {
        
menu_additem(iMenu"Crear nueva cuenta", .callback g_iMenuCB);
        
menu_additem(iMenu"Identificarse", .callback g_iMenuCB);
    }
    
    
menu_setprop(iMenuMPROP_EXITMEXIT_NEVER);
    
menu_display(idiMenu);
}

SM_BanMenu(id)
{
    static 
iMenuszText[18];
    
iMenu menu_create("Ban de cuentas""HM_BanMenu");
    
    
menu_additem(iMenu"Buscar jugador...");
    
formatex(szTextcharsmax(szText), "Acción: %s^n"g_iTypeBan[id] ? "\rDesbanear" "\yBanear");
    
menu_additem(iMenuszText);
    
    
menu_additem(iMenu"Lista de jugadores excluidos");
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_FindPlayer(idszName[])
{
    static 
iKeyIndexiResultadosiMenuszKeyIndex[2], szText[64];
    
formatex(szTextcharsmax(szText), "\yNombres que contengan\r: \w%s\r\R"szName);
    
iMenu menu_create(szText"HM_FindPlayer");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_PJ], szNameFINDFLAGS_CONTAIN|FINDFLAGS_CASE_SENSITIVE);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_PJ], szTextcharsmax(szText));
        
num_to_str(iKeyIndexszKeyIndexcharsmax(szKeyIndex));
        
menu_additem(iMenuszTextszKeyIndex);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"Iniciar nueva busqueda""0");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_PlayerList(id)
{
    static 
iMenuiKeyIndexiResultadosszName[32], szFecha[12], szText[64];
    
iMenu menu_create("Lista de jugadores excluidos\r\R""HM_PlayerList");
    
    
iResultados 0;
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], "/"FINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechacharsmax(szFecha));
        
adv_vault_get_keyname(g_iVaultiKeyIndexszNamecharsmax(szName));
        
formatex(szTextcharsmax(szText), "\w%s \r- \yFecha\r: \w%s"szNameszFecha);
        
menu_additem(iMenuszText);
        
iResultados++;
    }
    
adv_vault_find_closed(g_iVault);
    
    if (!
iResultados)
        
menu_additem(iMenu"No se encontraron usuarios baneados");
    
    if (
iResultados 7)
    {
        
menu_setprop(iMenuMPROP_BACKNAME"Atrás");
        
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    }
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

SM_Configs(id)
{
    static 
iMenuszText[52];
    
iMenu menu_create("Configurar mi cuenta""HM_Configs");
    
    
menu_additem(iMenu"Cambiar mi contraseña");
    
formatex(szTextcharsmax(szText), "¿ Recordar mi cuenta ? %s^n^n\
    \yCUENTA\r: \w#%d"
g_iAutoLog[id] ? "\y[Si]" "\r[No]"adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
menu_additem(iMenuszText);
    
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
menu_display(idiMenu);
}

/** Callbacks Menus **/
public CM_Register(idiMenuiItem)
{
    if (!
CheckName(id) && !iItem)
        return 
ITEM_ENABLED;
    else if (
CheckName(id) && iItem)
        return 
ITEM_ENABLED;
    
    return 
ITEM_DISABLED;
}

/** Handlers Menus **/
public HM_Register(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
g_bBanned & (1<<(id 1)))
    {
        
menu_destroy(iMenu);
        
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
client_cmd(id"messagemode ^"%s^""iItem "IDENTIFLY_PASSWORD" "CREATE_PASSWORD");
    
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña!."g_szPrefix);
    return 
PLUGIN_HANDLED;
}

public 
HM_BanMenu(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    switch (
iItem)
    {
        case 
0
        {
            
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
            
ChatColor(idBLUE"^x04%s^x03 Ingresa el nombre del jugador ^x04(^x01Puede ser una parte de Ã©l^x04)^x01."g_szPrefix);
        }
        case 
1
        {
            
g_iTypeBan[id] = !(g_iTypeBan[id]);
            
SM_BanMenu(id);
        }
        case 
2SM_PlayerList(id);
    }
    
    return 
PLUGIN_HANDLED;
}

public 
HM_FindPlayer(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
        
SM_BanMenu(id);
        
g_szAdminBan[id][0] = '^0';
        return 
PLUGIN_HANDLED;
    }
    
    static 
iGetInfoszItem[2], szName[32], iKeyIndex;
    
menu_item_getinfo(iMenuiItemiGetInfoszItemcharsmax(szItem), szNamecharsmax(szName), iGetInfo);
    
iKeyIndex str_to_num(szItem);
    
    if (!
iKeyIndex)
    {
        
menu_destroy(iMenu);
        
client_cmd(id"messagemode ^"INSERT_USERNAME^"");
        return 
PLUGIN_HANDLED;
    }
    
    
formatex(g_szPlayerName_Bancharsmax(g_szPlayerName_Ban), szName);
    
    if (
g_iTypeBan[id])
        
ShowBanPlayer(id1);
    else
    {
        
client_cmd(id"messagemode ^"INSERT_DATE^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa la fecha de vencimiento"g_szPrefix);
        
ChatColor(idBLUE"^x04%s^x03 Formato de fecha:^x01 MES / DÍA / AÑO ^x04(Dos Ãºltimos dígitos)."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_PlayerList(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        
SM_BanMenu(id);
        return 
PLUGIN_HANDLED;
    }
    
    
menu_destroy(iMenu);
    
SM_PlayerList(id);
    return 
PLUGIN_HANDLED;
}

public 
HandlerMenu_Confirmar(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (!
iItem)
        
ShowBanPlayer(id0);
    else
        
SM_BanMenu(id);
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
HM_Configs(idiMenuiItem)
{
    if (~
g_bConnected & (1<<(id 1)) || iItem == MENU_EXIT)
    {
        
menu_destroy(iMenu);
        return 
PLUGIN_HANDLED;
    }
    
    if (
iItem)
    {
        
g_iAutoLog[id] = !(g_iAutoLog[id]);
        
SM_Configs(id);
    }
    else
    {
        
client_cmd(id"messagemode ^"CURRENT_PASSWORD^"");
        
ChatColor(idBLUE"^x04%s^x03 Ingresa tu contraseña actual para continuar."g_szPrefix);
    }
    
    
menu_destroy(iMenu);
    return 
PLUGIN_HANDLED;
}

public 
Message_ShowMenu(iMsgIDiDestiEntity)
{
    static 
szMenuCode[32];
    
get_msg_arg_string(4szMenuCodecharsmax(szMenuCode));
    
    if (
contain(szMenuCode"#Team") == -1)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);    
    
EnableHamForward(g_iHam_PreThink);
    return 
PLUGIN_HANDLED;
}

public 
Message_VGUIMenu(iMsgIDiDestiEntity)
{
    if (
get_msg_arg_int(1) != OFFSET_VGUI_MENU)
        return 
PLUGIN_CONTINUE;
    
    static 
CsTeams:iTeam;
    
iTeam cs_get_user_team(iEntity);
    if (
g_bLogged & (1<<(iEntity 1)) && (iTeam == CS_TEAM_SPECTATOR || iTeam == CS_TEAM_UNASSIGNED))
        return 
PLUGIN_CONTINUE;
    
    
CheckUser(iEntity);
    return 
PLUGIN_HANDLED;
}

public 
CheckUser(id)
{
    if (~
g_bLogged & (1<<(id 1)))
    {
        static 
szFechaBan[15], szPlayerIP[21];
        
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
strlen(szFechaBan) > 3)
            
g_bBanned |= (1<<(id 1));
        else
        {
            
adv_vault_get_field(g_iVaultg_iCampos[D_IP], szPlayerIPcharsmax(szPlayerIP));
            if (
g_iAutoLog[id] && equal(szPlayerIPg_szPlayerIP[id]))
            {
                
g_bLogged |= (1<<(id 1));
                
engclient_cmd(id"chooseteam");
                return;
            }
        }
        
        
SM_Register(id);
    }
}

public 
ShowBanPlayer(idiTypeBan)
{
    switch (
iTypeBan)
    {
        case 
0:
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
server_cmd("kick ^"%s^" ^"%s^""g_szPlayerName_Bang_szMessage2);
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 baneó la cuenta de ^x04%s^x03 -^x01 Fecha de vencimiento: ^x04%s"g_szPrefixg_szAdminBan[id], g_szPlayerName_Bang_szFechaVen[id]);
            
ChatColor(0GREEN"^x04%s^x01 Razón de ban:^x04 %s"g_szPrefixg_szRazonBan[id]);
        }
        case 
1:
        {
            static 
szFechaBan[21];
            
adv_vault_get_prepare(g_iVault_g_szPlayerName_Ban);
            
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
            
            if (
containi(szFechaBan[2], "") != -&& containi(szFechaBan[5], "") != -1)
            {
                
ChatColor(idGREEN"^x04%s^x01 El jugador que intentas desbanear, no está baneado en el servidor."g_szPrefix);
                return;
            }
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
            
adv_vault_set_end(g_iVault0g_szPlayerName_Ban);
            
            
ChatColor(0GREEN"^x04%s^x01 Admin ^x04%s^x01 desbaneó la cuenta de ^x04%s"g_szPrefixg_szPlayerName[id], g_szPlayerName_Ban);
        }
    }
}

public 
GuardarDatos(idisIP)
{
    
adv_vault_set_start(g_iVault);
    if (
isIP)
        
adv_vault_set_field(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id]);
    else
    {
        
adv_vault_set_field(g_iVaultg_iCampos[D_PJ], g_szPlayerName[id]);
        
adv_vault_set_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id]);
    }
    
adv_vault_set_field(g_iVaultg_iCampos[D_AUTOLOG], g_iAutoLog[id]);
    
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammopacks(id));
    
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
}

public 
CargarDatos(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return;
    
    
adv_vault_get_field(g_iVaultg_iCampos[D_PASSWORD], g_szPassword[id], charsmax(g_szPassword[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id], charsmax(g_szAdminBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id], charsmax(g_szFechaBan[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id], charsmax(g_szFechaVen[]));
    
adv_vault_get_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id], charsmax(g_szRazonBan[]));    
    
g_iAutoLog[id] = adv_vault_get_field(g_iVaultg_iCampos[D_AUTOLOG]);
    
zp_set_user_ammopacks(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
    
}

public 
Bienvenida(id)
{
    
ChatColor(0GREEN"^x04%s^x01 Bienvenido ^x03%s^x01. Eres la cuenta registrada ^x04#%d"g_szPrefixg_szPlayerName[id], adv_vault_get_keyindex(g_iVaultg_szPlayerName[id]));
    
    static 
iKeyIndexszPlayerBan[32];
    
adv_vault_find_start(g_iVaultg_iCampos[D_IP], g_szPlayerIP[id], FINDFLAGS_CONTAIN);

    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszPlayerBancharsmax(szPlayerBan));
        
        static 
szFechaBan[21];
        
adv_vault_get_prepare(g_iVault_szPlayerBan);
        
adv_vault_get_field(g_iVaultg_iCampos[D_FECHAVEN], szFechaBancharsmax(szFechaBan));
        
        if (
containi(szFechaBan[2], "/") != -&& containi(szFechaBan[5], "/") != -1)
        {
            
get_time("%d/%m/%Y - %H:%M:%S"g_szFechaBan[id], charsmax(g_szFechaBan[]));
            
            
adv_vault_set_start(g_iVault);
            
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], g_szAdminBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], g_szFechaBan[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], g_szFechaVen[id]);
            
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], g_szRazonBan[id]);
            
adv_vault_set_end(g_iVault0g_szPlayerName[id]);
            
            
server_cmd("kick #%d ^"%s^""get_user_userid(id), g_szMessage2);
            
ChatColor(0RED"^x04%s^x01 El usuario (^x03%s^x01) ha sido baneado por coincidencias con otro usuario baneado"g_szPrefixg_szPlayerName[id]);
        }
    }
    
adv_vault_find_closed(g_iVault);
}

public 
DesbanCuentas(task)
{
    static 
iKeyIndexszKeyName[32], szDate[25];
    
get_time("%d/%m/%Y - %H:%M:%S"szDatecharsmax(szDate));
    
adv_vault_find_start(g_iVaultg_iCampos[D_FECHAVEN], szDateFINDFLAGS_CONTAIN);
    
    while ((
iKeyIndex adv_vault_find_next(g_iVault)))
    {
        
adv_vault_get_keyname(g_iVaultiKeyIndexszKeyNamecharsmax(szKeyName));
        
        
adv_vault_set_start(g_iVault);
        
adv_vault_set_field(g_iVaultg_iCampos[D_ADMINBAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHABAN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_FECHAVEN], "");
        
adv_vault_set_field(g_iVaultg_iCampos[D_RAZONBAN], "");
        
adv_vault_set_end(g_iVault0szKeyName);
        
        
ChatColor(0GREEN"^x04%s^x01 El usuario ^x04%s^x01 no está más baneado y puede volver a jugar"g_szPrefixszKeyName);
    }
    
adv_vault_find_closed(g_iVault);
}

public 
CheckName(id)
{
    if (!
adv_vault_get_prepare(g_iVault_g_szPlayerName[id]))
        return 
false;
    
    return 
true;
}

stock CheckString(szString[], szCaracter[], iLen)
{
    static 
iSz;
    for (
iSz 0iSz sizeof(g_szCaracteres); iSz++)
    {
        if (
containi(szStringg_szCaracteres[iSz]) != -1)
        {
            
formatex(szCaracteriLen"%s"g_szCaracteres[iSz]);
            return 
PLUGIN_HANDLED;
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

stock szRemove_Quotes(const szStr[], szOut[])
{
    if (!
szStr[1])
    {
        
szOut[0] = EOS;
        return 
0;
    }
    
    
copy(szOutstrlen(szStr)-2szStr[1]);
    
trim(szOut);
    
    static 
iLen;
    
iLen strlen(szOut);
    
    for (new 
0iLeni++)
    {
        if (
szOut[i] == '"')
            return 
0;
    }
    
    return 
iLen;
}

stock StringCount(const szString[], szSeachStr)
{
    static 
iCountiLen;
    
iLen strlen(szString);
    
    for (new 
0<= iLeni++)
    {
        if (
szString[i] == szSeachStr)
            
iCount++;
    }
    
    return 
iCount;

Responder
#12
Pasa la librería zombieplague.
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#13
(14/04/2015, 02:41 AM)CSAxel escribió: Pasa la librería zombieplague.

Código PHP:
/*================================================================================
    
    ---------------------------------------
    -*- Zombie Plague 4.3 Includes File -*-
    ---------------------------------------
    
    ~~~~~~~~~~
    - How To -
    ~~~~~~~~~~
    
    To make use of the Zombie Plague API features in your plugin, just
    add the following line at the beginning of your script:
    
    #include <zombieplague>
    
    ~~~~~~~~~~~
    - Natives -
    ~~~~~~~~~~~
    
    These work just like any other functions: you may have to pass
    parameters and they usually return values.
    
    Example:
    
    if ( is_user_alive( id ) && zp_get_user_zombie( id ) )
    {
        server_print( "Player %d is alive and a zombie", id )
    }
    
    ~~~~~~~~~~~~
    - Forwards -
    ~~~~~~~~~~~~
    
    Forwards get called whenever an event happens during the game.
    You need to make a public callback somewhere on your script,
    and it will automatically be triggered when the event occurs.
    
    Example:
    
    public zp_user_infected_post( id, infector, nemesis )
    {
        if ( !infector || nemesis )
            return;
        
        server_print( "Player %d just got infected by %d!", id, infector )
    }
    
    Also, take note of cases when there's a suffix:
    
    * _pre  : means the forward will be called BEFORE the event happens
    * _post : means it will be called AFTER the event takes place
    
=================================================================================*/

#if defined _zombieplague_included
  #endinput
#endif
#define _zombieplague_included

/* Teams for zp_register_extra_item() */
#define ZP_TEAM_ZOMBIE (1<<0)
#define ZP_TEAM_HUMAN (1<<1)
#define ZP_TEAM_NEMESIS (1<<2)
#define ZP_TEAM_SURVIVOR (1<<3)

/* Game modes for zp_round_started() */
enum
{
    
MODE_INFECTION 1,
    
MODE_NEMESIS,
    
MODE_SURVIVOR,
    
MODE_SWARM,
    
MODE_MULTI,
    
MODE_PLAGUE
}

/* Winner teams for zp_round_ended() */
enum
{
    
WIN_NO_ONE 0,
    
WIN_ZOMBIES,
    
WIN_HUMANS
}

/* Custom forward return values */
#define ZP_PLUGIN_HANDLED 97

/**
 * Returns whether a player is a zombie.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_zombie(id)

/**
 * Returns whether a player is a nemesis.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_nemesis(id)

/**
 * Returns whether a player is a survivor.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_survivor(id)

/**
 * Returns whether a player is the first zombie.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_first_zombie(id)

/**
 * Returns whether a player is the last zombie.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_last_zombie(id)

/**
 * Returns whether a player is the last human.
 *
 * @param id        Player index.
 * @return        True if it is, false otherwise.
 */
native zp_get_user_last_human(id)

/**
 * Returns a player's current zombie class ID.
 *
 * @param id        Player index.
 * @return        Internal zombie class ID, or -1 if not yet chosen.
 */
native zp_get_user_zombie_class(id)

/**
 * Returns a player's next zombie class ID (for the next infection).
 *
 * @param id        Player index.
 * @return        Internal zombie class ID, or -1 if not yet chosen.
 */
native zp_get_user_next_class(id)

/**
 * Sets a player's next zombie class ID (for the next infection).
 *
 * @param id        Player index.
 * @param classid    A valid zombie class ID.
 * @return        True on success, false otherwise.
 */
native zp_set_user_zombie_class(idclassid)

/**
 * Returns a player's ammo pack count.
 *
 * @param id        Player index.
 * @return        Number of ammo packs owned.
 */
native zp_get_user_ammo_packs(id)

/**
 * Sets a player's ammo pack count.
 *
 * @param id        Player index.
 * @param amount    New quantity of ammo packs owned.
 */
native zp_set_user_ammo_packs(idamount)

/**
 * Returns the default maximum health of a zombie.
 *
 * Note: Takes into account first zombie's HP multiplier.
 *
 * @param id        Player index.
 * @return        Maximum amount of health points, or -1 if not a normal zombie.
 */
native zp_get_zombie_maxhealth(id)

/**
 * Returns a player's custom flashlight batteries charge.
 *
 * @param id        Player index.
 * @return        Charge percent (0 to 100).
 */
native zp_get_user_batteries(id)

/**
 * Sets a player's custom flashlight batteries charge.
 *
 * @param id        Player index.
 * @param value        New charge percent (0 to 100).
 */
native zp_set_user_batteries(idcharge)

/**
 * Returns whether a player has night vision.
 *
 * @param id        Player index.
 * @return        True if it has, false otherwise.
 */
native zp_get_user_nightvision(id)

/**
 * Sets whether a player has night vision.
 *
 * @param id        Player index.
 * @param set        True to give, false for removing it.
 */
native zp_set_user_nightvision(idset)

/**
 * Forces a player to become a zombie.
 *
 * Note: Unavailable for last human/survivor.
 *
 * @param id        Player index to be infected.
 * @param infector    Player index who infected him (optional).
 * @param silent    If set, there will be no HUD messages or infection sounds.
 * @param rewards    Whether to show DeathMsg and reward frags, hp, and ammo packs to infector.
 * @return        True on success, false otherwise.
 */
native zp_infect_user(idinfector 0silent 0rewards 0)

/**
 * Forces a player to become a human.
 *
 * Note: Unavailable for last zombie/nemesis.
 *
 * @param id        Player index to be cured.
 * @param silent    If set, there will be no HUD messages or antidote sounds.
 * @return        True on success, false otherwise.
 */
native zp_disinfect_user(idsilent 0)

/**
 * Forces a player to become a nemesis.
 *
 * Note: Unavailable for last human/survivor.
 *
 * @param id        Player index to turn into nemesis.
 * @return        True on success, false otherwise.
 */
native zp_make_user_nemesis(id)

/**
 * Forces a player to become a survivor.
 *
 * Note: Unavailable for last zombie/nemesis.
 *
 * @param id        Player index to turn into survivor.
 * @return        True on success, false otherwise.
 */
native zp_make_user_survivor(id)

/**
 * Respawns a player into a specific team.
 *
 * @param id        Player index to be respawned.
 * @param team        Team to respawn the player into (ZP_TEAM_ZOMBIE or ZP_TEAM_HUMAN).
 * @return        True on success, false otherwise.
 */
native zp_respawn_user(idteam)

/**
 * Forces a player to buy an extra item.
 *
 * @param id        Player index.
 * @param itemid    A valid extra item ID.
 * @param ignorecost    If set, item's cost won't be deduced from player.
 * @return        True on success, false otherwise.
 */
native zp_force_buy_extra_item(iditemidignorecost 0)

/**
 * Returns whether the ZP round has started, i.e. first zombie
 * has been chosen or a game mode has begun.
 *
 * @return        0 - Round not started
 *            1 - Round started
 *            2 - Round starting
 */
native zp_has_round_started()

/**
 * Returns whether the current round is a nemesis round.
 *
 * @return        True if it is, false otherwise.
 */
native zp_is_nemesis_round()

/**
 * Returns whether the current round is a survivor round.
 *
 * @return        True if it is, false otherwise.
 */
native zp_is_survivor_round()

/**
 * Returns whether the current round is a swarm round.
 *
 * @return        True if it is, false otherwise.
 */
native zp_is_swarm_round()

/**
 * Returns whether the current round is a plague round.
 *
 * @return        True if it is, false otherwise.
 */
native zp_is_plague_round()

/**
 * Returns number of alive zombies.
 *
 * @return        Zombie count.
 */
native zp_get_zombie_count()

/**
 * Returns number of alive humans.
 *
 * @return        Human count.
 */
native zp_get_human_count()

/**
 * Returns number of alive nemesis.
 *
 * @return        Nemesis count.
 */
native zp_get_nemesis_count()

/**
 * Returns number of alive survivors.
 *
 * @return        Survivor count.
 */
native zp_get_survivor_count()

/**
 * Registers a custom item which will be added to the extra items menu of ZP.
 *
 * Note: The returned extra item ID can be later used to catch item
 * purchase events for the zp_extra_item_selected() forward.
 *
 * Note: ZP_TEAM_NEMESIS and ZP_TEAM_SURVIVOR can be used to make
 * an item available to Nemesis and Survivors respectively.
 *
 * @param name        Caption to display on the menu.
 * @param cost        Ammo packs to be deducted on purchase.
 * @param teams        Bitsum of teams it should be available for.
 * @return        An internal extra item ID, or -1 on failure.
 */
native zp_register_extra_item(const name[], costteams)

/**
 * Registers a custom class which will be added to the zombie classes menu of ZP.
 *
 * Note: The returned zombie class ID can be later used to identify
 * the class when calling the zp_get_user_zombie_class() natives.
 *
 * @param name        Caption to display on the menu.
 * @param info        Brief description of the class.
 * @param model        Player model to be used.
 * @param clawmodel    Claws model to be used.
 * @param hp        Initial health points.
 * @param speed        Maximum speed.
 * @param gravity    Gravity multiplier.
 * @param knockback    Knockback multiplier.
 * @return        An internal zombie class ID, or -1 on failure.
 */
native zp_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hpspeedFloat:gravityFloat:knockback)

native zp_register_human_class(const name[], const info[], const model[], hpspeedFloat:gravity)

native zp_get_user_human_class(id)

native zp_set_user_human_class(idclassid)

native zp_get_human_class_id(const name[])

/**
 * Returns an extra item's ID.
 *
 * @param name        Item name to look for.
 * @return        Internal extra item ID, or -1 if not found.
 */
native zp_get_extra_item_id(const name[])

/**
 * Returns a zombie class' ID.
 *
 * @param name        Class name to look for.
 * @return        Internal zombie class ID, or -1 if not found.
 */
native zp_get_zombie_class_id(const name[])

/**
 * Called when the ZP round starts, i.e. first zombie
 * is chosen or a game mode begins.
 *
 * @param gamemode    Mode which has started.
 * @param id        Affected player's index (if applicable).
 */
forward zp_round_started(gamemodeid)

/**
 * Called when the round ends.
 *
 * @param winteam    Team which has won the round.
 */
forward zp_round_ended(winteam)

/**
 * Called when a player gets infected.
 *
 * @param id        Player index who was infected.
 * @param infector    Player index who infected him (if applicable).
 * @param nemesis    Whether the player was turned into a nemesis.
 */
forward zp_user_infected_pre(idinfectornemesis)
forward zp_user_infected_post(idinfectornemesis)

/**
 * Called when a player turns back to human.
 *
 * @param id        Player index who was cured.
 * @param survivor    Whether the player was turned into a survivor.
 */
forward zp_user_humanized_pre(idsurvivor)
forward zp_user_humanized_post(idsurvivor)

/**
 * Called on a player infect/cure attempt. You can use this to block
 * an infection/humanization by returning ZP_PLUGIN_HANDLED in your plugin.
 *
 * Note: Right now this is only available after the ZP round starts, since some
 * situations (like blocking a first zombie's infection) are not yet handled.
 */
forward zp_user_infect_attempt(idinfectornemesis)
forward zp_user_humanize_attempt(idsurvivor)

/**
 * Called when a player buys an extra item from the ZP menu.
 *
 * Note: You can now return ZP_PLUGIN_HANDLED in your plugin to block
 * the purchase and the player will be automatically refunded.
 *
 * @param id        Player index of purchaser.
 * @param itemid    Internal extra item ID.
 */
forward zp_extra_item_selected(iditemid)

/**
 * Called when a player gets unfrozen (frostnades).
 *
 * @param id        Player index.
 */
forward zp_user_unfrozen(id)

/**
 * Called when a player becomes the last zombie.
 *
 * Note: This is called for the first zombie too.
 *
 * @param id        Player index.
 */
forward zp_user_last_zombie(id)

/**
 * Called when a player becomes the last human.
 *
 * @param id        Player index.
 */
forward zp_user_last_human(id)


/**
 * @deprecated - Do not use!
 * For backwards compatibility only.
 */
#define ZP_TEAM_ANY 0 
Responder
#14
Código PHP:
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammopacks(id)); 
>
Código PHP:
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammo_packs(id)); 
Código PHP:
zp_set_user_ammopacks(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
>
Código PHP:
zp_set_user_ammo_packs(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
Ahora si compilaría..
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#15
(14/04/2015, 02:11 PM)CSAxel escribió:
Código PHP:
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammopacks(id)); 
>
Código PHP:
adv_vault_set_field(g_iVaultg_iCampos[D_AMMOPACKS], zp_get_user_ammo_packs(id)); 
Código PHP:
zp_set_user_ammopacks(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
>
Código PHP:
zp_set_user_ammo_packs(id,  adv_vault_get_field(g_iVaultg_iCampos[D_AMMOPACKS])); 
Ahora si compilaría..


Excelente Brother guarda perfecto Cutecry
me puedes explicar la ultima parte? que pasaba? porque no compilaba?
Responder
#16
Cita:Excelente Brother guarda perfecto Cutecry
me puedes explicar la ultima parte? que pasaba? porque no compilaba?

Pasarias el code por favor es q ando intentandolo y nada :S

o es q hay q hacerlo con el amxmod 1.8.3?
No me impresiona nada que mis ojos no puedan ver. Fuck yeah
Responder
#17
Porque la native de los ammopacks la escribí mal, entonces la redacté como estaba en la librería.

El plugin puede ser usado en cualquier versión desde la v1.8.1 en adelante.
Pero si no funciona, recomendaría instalar la última versión (v1.8.3)
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#18
Cita:Porque la native de los ammopacks la escribí mal, entonces la redacté como estaba en la librería.

El plugin puede ser usado en cualquier versión desde la v1.8.1 en adelante.
Pero si no funciona, recomendaría instalar la última versión (v1.8.3)

es q donde tengo hosteado el sv mio usa el 1.8.1 y si le meto plugins de 1.8.3 me dice q no es la version del amxmod y simplemente no lo activa.
No me impresiona nada que mis ojos no puedan ver. Fuck yeah
Responder
#19
Actualiza el AMX ya casi todos deberían tener el AMX actualizado, como mínimo la v1.8.2.
Te lo digo para que no quedes en retraso como yo Roflmao
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)