AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Guías/Tutoriales (https://forums.alliedmods.net/forumdisplay.php?f=137)
-   -   [CON y SIN ZP] Crear Cuentas y guardado de Datos. (https://forums.alliedmods.net/showthread.php?t=122372)

Kiske 03-26-2010 07:59

[CON y SIN ZP] Crear Cuentas y guardado de Datos.
 
2 Attachment(s)
ATENCIÓN: No doy más soporte a esto y probablemente esté desactualizado y genere errores!


Aprendizaje necesario: Básico sobre algunas Funciones.
Aprendizaje extra: Aprenderse el Include del FVault que está posteado en este Post.
Bueno, no hay nada mas que decir, esta todo explicado en el Codigo.

¡ Sin ZombiePlague !
PHP Code:

#include < amxmodx >
#include < fakemeta >
#include < fvault >
#include < cstrike >

// Creamos variables globales
new SZ_Password192 ]
new 
SZ_Password_T33 ][ 192 ]

new 
Registrado33 ]
new 
BadPassword33 ]

new const 
Vault[] = "_Datos" // Nombre del Archivo donde se guardaran los Datos.

public plugin_init( )
{
    
register_plugin"Tutorial""1.0""Kiske" )
    
    
register_forwardFM_ClientUserInfoChanged"FWClientUserInfoChanged" // Si no me equivoco esta forward se llama cuando el usuario cambia algo de su setinfo.

    
register_clcmd"say /registrarse""CMDRegistrarse" )
    
register_clcmd"IntroducirContrasenia""CMDIntroducirContrasenia" )
}

public 
client_disconnectIndex )
    
SaveIndex // Esta función ponganla en todos los lugares donde quieren que se guarden sus cosas.

public client_putinserverIndex )
{
    
RegistradoIndex ] = 0
    BadPassword
Index ] = 0
    Load
Index )
}

public 
CMDRegistrarseIndex )
{
    if( 
RegistradoIndex ] || BadPasswordIndex ] )
        return 
PLUGIN_HANDLED;
    
    
client_cmdIndex"messagemode IntroducirContrasenia" )
    
    return 
PLUGIN_CONTINUE;
}

public 
CMDIntroducirContraseniaIndex )
{
    
read_argsSZ_Password191 // Ponemos en la Variable SZ_Password lo que escribió como Contraseña
    
remove_quotesSZ_Password // Analiza lo que escribimos
    
trimSZ_Password // Esta opción es para remover los ESPACIOS ( si es que puso ) al principio y al final de lo que escribió

    
if( equalSZ_Password"" ) || containSZ_Password" ") != -1// En la primer parte, verificamos si lo que ingresó contiene algo......y en la segunda parte verificamos si lo que ingresó tiene espacios, si coincide alguna de las dos cosas, no se lo aceptamos.
        
return PLUGIN_HANDLED;
    else 
// Si se llama esta parte, quiere decir que lo que ingresó contiene algo y no tiene espacios.
    
{
        
client_cmdIndex"setinfo _pass ^"%s^""SZ_Password // Creamos una Setinfo al jugador con el prefijo _pass y la contraseña que ingresó. Ustedes si quieren cambienle el prefijo.
        
RegistradoIndex ] = 1
        
        
// Guardamos el Nombre, ls Password y el Dinero actual
        
static SZ_Name32 ], SZ_Data512 ]
        
get_user_nameIndexSZ_Name31 )
        
        
// Si quieren agregar mas Datos solo vayan aumentando el Parametro y las Variables.
        
formatexSZ_DatacharsmaxSZ_Data ), "%s %d"SZ_Passwordcs_get_user_moneyIndex ) )
            
        
// Esta función del FVault sirve para setear datos ( Recomiendo: Que lean el Include del FVault que está posteado al final de este Post )
        
fvault_set_dataVaultSZ_NameSZ_Data )
        
        
// Fixeamos un Error ya que si es la Primera vez que se registra, cuando llame al Save no aparecerá ninguna Password, esto lo Fixea.
        
SZ_Password_TIndex ] = SZ_Password
        
        
return PLUGIN_HANDLED;
    }
    
    return 
PLUGIN_CONTINUE;
}

public 
SaveIndex )
{
    if( !
RegistradoIndex ] || BadPasswordIndex ] ) // Si NO esta registrado, o si tiene la Contraseña Incorrecta, no le guardamos nada.
        
return PLUGIN_HANDLED;
    
    
// Voy a dar un Ejemplo en el caso de que quieran guardar Dinero o lo que sea.
    
    
static SZ_Data512 ], SZ_Name32 ]
    
    
formatexSZ_DatacharsmaxSZ_Data ), "%s %d"SZ_Password_TIndex ], cs_get_user_moneyIndex ) )
    
get_user_nameIndexSZ_Name31 )
    
    
fvault_set_dataVaultSZ_NameSZ_Data )
    
    return 
PLUGIN_CONTINUE;
}

public 
LoadIndex )
{
    static 
SZ_Data512 ], SZ_Name32 ], SETINFO_Password191 ], VAULT_Password191 ], Dinero11 ]
    
    
get_user_nameIndexSZ_Name31 )
    
get_user_infoIndex"_pass"SETINFO_Password190 // Seteamos en SETINFO_Password lo que tiene como Setinfo con el prefijo _pass
    
    
if( !fvault_get_dataVaultSZ_NameSZ_DatacharsmaxSZ_Data ) ) ) // Detectamos si NO existe su Nombre y Data en el Vault. En ese caso, les dejo a su Creatividad para que piensen.
        
return 0;
    
    
RegistradoIndex ] = 1
    
    
// El Nombre y la Password JAMÁS la cargen.
    // Voy a dar un Ejemplo en el caso de que quieran cargar Dinero o lo que sea.
    
    
parseSZ_DataVAULT_Password190Dinero10 // La función PARSE, separa los Datos 1 por 1. Si guardamos la Password primero, y el Dinero despues, entonces este Parse está bien, obviamente tiene que seguir el Orden en el que se guardó.
    
    
if( equalSETINFO_PasswordVAULT_Password ) ) // Si la Contraseña del Jugador coincide con la Registrada de su Nick, cargamos sus Datos.
    
{
        
// Fixeamos un Error para que no reemplaze la Password Registrada por alguna que puede llegar a cambiar el adentro del Server.
        
SZ_Password_TIndex ] = SETINFO_Password
        
        
// Cargamos el Dinero. ( Numero )
        
cs_set_user_moneyIndexstr_to_numDinero ) )
        
        
// Si cargan una Variable es así:
        // Money = str_to_num( Dinero )
        
        // Y si cargan una Native como en el caso de cs_set_user_money, bueno ya esta puesto arriba.
        
        // Ejemplo de: Cargar un Float
        // Variable_De_Float[ Index ] = str_to_float( Float )
        
        
return 2;
    }
    else 
// Si la Contraseña del Jugador NO coincide con la Registrada de su Nick, podemos Kickearlo, mandarlo a Spect, un menú, les dejo su creatividad...
    
{
        
BadPasswordIndex ] = 1
        
//....
    
}
    
    return 
1;
}

public 
FWClientUserInfoChangedIndexBuffer )
{
    if( !
is_user_connectedIndex ) )
        return 
FMRES_IGNORED;
    
    static 
NickName[32], NickOld[32]; get_user_nameIndexNickOld31 )
    
engfuncEngFunc_InfoKeyValueBuffer"name"NickName31 // Si tampoco me confundo, esto obtiene el valor "name" de su setinfo.
    
    
if( equalNickNameNickOld ) )
        return 
FMRES_IGNORED;
    
    
engfuncEngFunc_SetClientKeyValueIndexBuffer"name"NickOld // Le volvemos a poner el nick viejo para que no se lo pueda cambiar.
    
    
client_cmdIndex"name ^"%s^"; setinfo name ^"%s^""NickOldNickOld )
    
    return 
FMRES_SUPERCEDE;


Datos Extras:
  • Una vez que te Registraste, no te podes volver a Registrar CON el mismo NICK.
  • Si tenes la Password incorrecta, les dejo a su creatividad lo que quieran hacer, ahi ya dice donde es que le da la Password incorrecta, obviamente no te podes volver a Registrar.
  • Cuando se te guardan los Datos por primera vez es algo asi: "Kiske" "PendejoAlcahuete 800"
  • Cuando me desconecte, que se guardan los Datos, se me guardaron así: "Kiske" "PendejoAlcahuete 4600", obviamente porque gane Dinero.
  • Testee todos los Bugs posibles, y 0 errores.





¡ Con ZombiePlague y con Menú de Registro y Logeo !
PHP Code:

#include < fvault >

// Creamos variables globales
new SZ_Password33 ][ 192 ]
new 
SZ_Password_T33 ][ 192 ]

new 
Registrado33 ]
new 
BadPassword33 ]

new const 
Vault[] = "_Datos" // Nombre del Archivo donde se guardaran los Datos.

public plugin_init( )
{
    
register_clcmd"say /registrarse""CMDRegistrarse" )
    
register_clcmd"IntroducirContrasenia""CMDIntroducirContrasenia" )
}

public 
client_disconnectIndex )
    
SaveIndex // Esta función ponganla en todos los lugares donde quieren que se guarden sus cosas.

public client_putinserverIndex )
{
    
RegistradoIndex ] = 0
    BadPassword
Index ] = 0
   
    set_task
0.1"clcmd_changeteam"Index // Les va a aparecer el Menú igual por más que tengan MOTD y esas mierdas.
   
    // Esta función ponganla abajo del reset_vars y abajo del statssave.
    
LoadIndex )
}

// ATENCIÓN ACA !!:
// En la Función que se llama: clcmd_changeteam(id) van a reemplazar todo lo que tengan por esto, a continuacion les explico:
public clcmd_changeteamIndex )
{
    static 
TeamTeam get_user_teamIndex )
   
    if( ( 
Team == || Team == ) && !BadPasswordIndex ] && RegistradoIndex ] ) // Si esta en el Team UNNASIGNED o SPECTATOR, si tiene bien la Password y si está Registrado...
        
return PLUGIN_CONTINUE// ... le muestra el Menú de Teams.
    
else if( !RegistradoIndex ] || BadPasswordIndex ] ) // Si no está Registrado o tiene mal la Password, le mostramos el Menú de Registro y Login.
    
{
        static 
MenuSZ_Items32 ]
        
Menu menu_create"\yTitulo""MenuBadPassword" )
        
formatexSZ_Items31"%s", !RegistradoIndex ] ? "Registrar nueva Cuenta" "Ingresar Contraseña" )
       
        
menu_additemMenuSZ_Items"1" //* Si no está Registrado la Opción esta será: "Registrar nueva Cuenta", de lo contrario será: "Ingresar Contraseña".
       
        
menu_setpropMenuMPROP_EXITNAME"Salir" )
        
menu_displayIndexMenu)
       
        return 
PLUGIN_HANDLED;
    }
    else
        
show_menu_gameIndex // Si le cambiaron el nombre a esta función, también deben cambiarselo acá.
       
    
return PLUGIN_HANDLED;
}

public 
CMDRegistrarseIndex )
{
    if( 
RegistradoIndex ] || BadPasswordIndex ] )
        return 
PLUGIN_HANDLED;
   
    
client_cmdIndex"messagemode IntroducirContrasenia" )
   
    return 
PLUGIN_CONTINUE;
}

public 
CMDIntroducirContraseniaIndex )
{
    
read_argsSZ_PasswordIndex ], charsmaxSZ_Password[ ] ) ) // Ponemos en la Variable SZ_Password lo que escribió como Contraseña
    
remove_quotesSZ_PasswordIndex ] ) // Analiza lo que escribimos
    
trimSZ_PasswordIndex ] ) // Esta opción es para remover los ESPACIOS ( si es que puso ) al principio y al final de lo que escribió

    
if( equalSZ_PasswordIndex ], "" ) || containSZ_PasswordIndex ], " ") != -1// En la primer parte, verificamos si lo que ingresó contiene algo......y en la segunda parte verificamos si lo que ingresó tiene espacios, si coincide alguna de las dos cosas, no se lo aceptamos.
        
return PLUGIN_HANDLED;
    else if( 
BadPasswordIndex ] ) // Si se llama esta parte, quiere decir que lo que ingresó contiene algo y no tiene espacios, pero también quiere decir que está Introduciendo la Contraseña para Logearse.
    
{
        static 
SZ_Data512 ], SZ_Name32 ], VAULT_Password191 ]
        
get_user_nameIndexSZ_Name31 )
        
        if( !
fvault_get_dataVaultSZ_NameSZ_DatacharsmaxSZ_Data ) ) )
            return 
0;
        
        
parseSZ_DataVAULT_Password190 )
        
        if( 
equalSZ_PasswordIndex ], VAULT_Password ) ) // Si lo que Ingreso coincide con la Password Registrada, lo mandamos a la Selección de Teams.
        
{
            
client_cmdIndex"setinfo _pass ^"%s^""SZ_PasswordIndex ] )
            
BadPasswordIndex ] = 0
            
            Load
Index )
            
            
// Fixeamos un Error ya que si es la Primera vez que se registra, cuando llame al Save no aparecerá ninguna Password, esto lo Fixea.
            
SZ_Password_TIndex ] = SZ_PasswordIndex ]
            
            return 
PLUGIN_HANDLED;
        }
        
        return 
PLUGIN_HANDLED;
    }
    else 
// Si se llama esta parte, quiere decir que lo que ingresó contiene algo y no tiene espacios.
    
{
        
client_cmdIndex"setinfo _pass ^"%s^""SZ_PasswordIndex ] ) // Creamos una Setinfo al jugador con el prefijo _pass y la contraseña que ingresó. Ustedes si quieren cambienle el prefijo.
        
RegistradoIndex ] = 1
       
        
// Guardamos el Nombre, ls Password y los AmmoPacks actuales
        
static SZ_Name32 ], SZ_Data512 ]
        
get_user_nameIndexSZ_Name31 )
       
        
// Si quieren agregar mas Datos solo vayan aumentando los parametros con su respectiva variable.
        
formatexSZ_DatacharsmaxSZ_Data ), "%s %d"SZ_PasswordIndex ], g_ammopacks[Index] )
       
        
// Esta función del FVault sirve para setear datos ( Recomiendo: Que lean el Include del FVault que está posteado al final de este Post )
        
fvault_set_dataVaultSZ_NameSZ_Data )
       
        
// Fixeamos un Error ya que si es la Primera vez que se registra, cuando llame al Save no aparecerá ninguna Password, esto lo Fixea.
        
SZ_Password_TIndex ] = SZ_PasswordIndex ]
       
        return 
PLUGIN_HANDLED;
    }
   
    return 
PLUGIN_CONTINUE;
}

public 
SaveIndex )
{
    if( !
RegistradoIndex ] || BadPasswordIndex ] ) // Si NO esta registrado, o si tiene la Contraseña Incorrecta, no le guardamos nada.
        
return PLUGIN_HANDLED;
   
    static 
SZ_Data512 ], SZ_Name32 ]
   
    
// Guardamos la Data.
    
formatexSZ_DatacharsmaxSZ_Data ), "%s %d"SZ_Password_TIndex ], g_ammopacks[Index] )
    
get_user_nameIndexSZ_Name31 )
   
    
fvault_set_dataVaultSZ_NameSZ_Data )
   
    return 
PLUGIN_CONTINUE;
}

LoadIndex )
{
    static 
SZ_Data512 ], SZ_Name32 ], SETINFO_Password191 ], VAULT_Password191 ], APs11 ]
   
    
get_user_nameIndexSZ_Name31 )
    
get_user_infoIndex"_pass"SETINFO_Password190 // Seteamos en SETINFO_Password lo que tiene como Setinfo con el prefijo _pass
   
    
if( !fvault_get_dataVaultSZ_NameSZ_DatacharsmaxSZ_Data ) ) ) // Detectamos si NO existe su Nombre y Data en el Vault. En ese caso, yo puse que lo mande al Menu de Teams ( Donde le pusimos que se Registre ).
    
{
        
set_task0.1"clcmd_changeteam"Index // Si le cambiaron el nombre a esta función, también deben cambiarselo acá. Si no les aparece el Menú de Teams cuando hacen esto, usen set_task de 0.2
        
return 0;
    }  
 
    
RegistradoIndex ] = 1
   
    
// El Nombre y la Password JAMÁS la cargen.
   
    
parseSZ_DataVAULT_Password190APs10 // La función PARSE, separa los Datos 1 por 1. Si guardamos la Password primero, y los AmmoPacks despues, entonces este Parse está bien, obviamente tiene que seguir el Orden en el que se guardó.
   
    
if( equalSETINFO_PasswordVAULT_Password ) ) // Si la Contraseña del Jugador coincide con la Registrada de su Nick, cargamos sus Datos.
    
{
        
// Fixeamos un Error para que no reemplaze la Password Registrada por alguna que puede llegar a cambiar el adentro del Server.
        
SZ_Password_TIndex ] = SETINFO_Password
       
        
// Cargamos los AmmoPacks. ( Numero )
        
g_ammopacks[Index] = str_to_numAPs )
        
        
set_task0.1"clcmd_changeteam"Index // Si le cambiaron el nombre a esta función, también deben cambiarselo acá. Si no les aparece el Menú de Teams cuando hacen esto, usen set_task de 0.2
       
        // Ejemplo de: Cargar un Float
        // Variable_De_Float[Index] = str_to_float( Float )
       
        
return 2;
    }
    else 
// Si la Contraseña del Jugador NO coincide con la Registrada de su Nick, podemos Kickearlo, mandarlo a Spect, un menú, etc..
    
{
        
BadPasswordIndex ] = 1
        
// Yo le voy a poner que si tiene mal la Password lo mande a Spect y el Menú de Ingresar la Password.
        
set_task0.1"clcmd_changeteam"Index // Si le cambiaron el nombre a esta función, también deben cambiarselo acá. Si no les aparece el Menú de Teams cuando hacen esto, usen set_task de 0.2.
        //....
    
}
   
    return 
1;
}

public 
MenuBadPasswordIndexMenuItem )
{
    if( 
Item == MENU_EXIT )
    {
        
menu_destroyMenu )
        return 
PLUGIN_HANDLED;
    }
    
    static 
AccessData[6], iName[64], CallBack
    menu_item_getinfo
MenuItemAccessData5iName63CallBack )
    switch( 
str_to_numData ) )
    {
        case 
1:
        {
            if( !
RegistradoIndex ] )
                
CMDRegistrarseIndex )
            else
                
client_cmdIndex"messagemode IntroducirContrasenia" )
        }
    }
    
    
menu_destroyMenu )
    return 
PLUGIN_HANDLED;


Datos Extras:
  • Una vez que te Registraste, no te podes volver a Registrar CON el mismo NICK.
  • Si tenes la Password incorrecta, los manda a un Menú de Logeo.
  • Cuando se te guardan los Datos por primera vez es algo asi: "Kiske" "PendejoAlcahuete 800"
  • Cuando me desconecte, que se guardan los Datos, se me guardaron así: "Kiske" "PendejoAlcahuete 4600", obviamente porque gane AmmoPacks.
  • No testee nada asi que si encuentran algún POSIBLE Bug, me lo hacen saber.
  • Algo que también quiero aclarar, es que para prohibir el CAMBIO de NICK, se fijen la primera parte SIN ZombiePlague, y fijense la Forward: register_forward( FM_ClientUserInfoChanged, "FWClientUserInfoChanged" ) que les va a servir para que no causen Bugs con los Nicks.

Bugs Encontrados:
  • Cuando te aparece el Menu de Registro / Login, si entras a otro Menú, se bugea y te deja entrar de CT y / o TT.
  • SOLUCIÓN: La única que logré hacer yo y efectiva, es bloqueando que entre a otros Menúes si Registrado[ Index ] era igual a 0 y / o si BadPassword[ Index ] era igual a 1.
¿ Como bloquear un Menú para que no pueda acceder a el si esas Variables están mal. ?
Todos los Menúes accesibles por SAY y / o CONSOLA, van a hacer que se bugeen, la solución es poner donde se llama la Función que se crea el MENÚ, el siguiente código:
PHP Code:

if( !RegistradoIndex ] || BadPasswordIndex] )
    return; 

Este pequeño cógido, deben ponerlo en todos los Menúes que se pueda acceder a traves de SAY y / o CONSOLA.

Ditoo! 03-26-2010 10:03

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Muy bueno... !!!. Gracias Kiske.

<-----(MATIAS)-----> 03-26-2010 10:32

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Muchas gracias Kiske ahora lo leo, lo necesitaba!!!

Y para que guarde ammo packs en ves de dinero, cambio cs_get_user_money por zp_get_user_ammopacks?

S34Qu4K3 03-26-2010 11:04

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Pero por q no podes crear otra cuenta?
SI te cambias de nick puedes?

Darkete 03-26-2010 11:35

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
por el setinfo ?.. o quiza no con ese nombre

Edit: Buen tuto... gracias

Niiqo 03-26-2010 11:40

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Quote:

Originally Posted by <-----(MATIAS)-----> (Post 1129298)
Muchas gracias Kiske ahora lo leo, lo necesitaba!!!

Y para que guarde ammo packs en ves de dinero, cambio cs_get_user_money por zp_get_user_ammopacks?

eso mismo iba a preguntar.-

lucas_7_94 03-26-2010 11:42

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Si matias.

Ditoo! 03-26-2010 11:43

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Ami no me kickea esta bien puesto? :S

PHP Code:

    }
    else
    {
        
BadPasswordIndex ] = 1
        server_cmd
("kick #%d ^"Password Incorrecta (setinfo _pass TUPASSWORD)^""get_user_useridIndex ) ) 
    }
    
    return 
1;



lucas_7_94 03-26-2010 12:31

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
Quote:

Originally Posted by vazmar (Post 1129397)
Creo que get_user_userid solo funciona con steam, sera por eso , nose

nah , sirve , no tiene nada que ver , authid usa steam.

Ditoo! 03-26-2010 12:47

Re: [ES][TUT] Crear Cuentas y guardado de Datos.
 
PHP Code:

        message_beginMSG_ONESVC_DISCONNECT_Index );
        
write_string"Password incorrecto" );
        
message_end( ); 

Corta la hise -.-


All times are GMT -4. The time now is 19:10.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.