Muy buenas Español-Pawno!
Bueno, antes de empezar con el tutorial, le pido una disculpa a toda la comunidad por no haberme hecho responsable por el cargo de moderador que tenia, me inactive por motivos muy personales pero ya estoy aquí, la verdad no creo que haya una segunda oportunidad, pero pues ni modo, también, como veo que la comunidad esta cayendo (muy inactiva) quise crear un nuevo tutorial para ustedes, espero que les guste y que les sirva de mucho. Empezamos...
Cosas que necesitaremos...
Lo primero que vamos a tener que tener, es el paquete YSI 1.0, si no lo tienen, comenten en el post y pondré el link. También necesitaremos tener los plugins streamer y sscanf.
Pasos de la creación...
Paso 1.- Abrimos nuestro pawn, creamos un nuevo proyecto y le borramos todas las lineas a excepción de los Callback's (Public's) y ponremos los Includes en la primera parte.
- Código:
#include <a_samp>
#include <YSI/y_ini>
Paso 2.- Despues, vamos a tener que crear la dirección en donde se guardaran las cuentas de los usuarios, iremos a la carpeta "SCRIPTFILES" y crearemos una carpeta a la que llamaremos "Registrados", despues de haber hecho esto, vamos otra vez al pawn y debajo de los includes, pondremos esto.
- Código:
#define DirecUsuario "/Registrados/%s.ini" // ------- Directorio de Usuarios.
Paso 3.- Luego crearemos un "Enum" el cual guardara todos los stats del usuario. Estas variables son las que se usaran para crear sistemas, comandos, etc...
- Código:
enum pInfo
{
pLlave[64], // contraseña - maximos caracteres 64
pAdmin,
pVip,
Intentos_Spam,
pCash,
};
new PlayerInfo[MAX_PLAYERS][pInfo];
Paso 4.- Luego crearemos estos news debajo del Enum.
- Código:
new ComprobarSiLogueo [MAX_PLAYERS];
new gPlayerLogged [MAX_PLAYERS];
new Limite_Intentos_Log [MAX_PLAYERS];
Paso 5.- Luego, tendremos que crear estos forwards para poder crear los callbacks del registro.
- Código:
forward Load_Datos_pInfo(playerid, name[], value[]);
forward Register_Datos_pInfo(playerid, password[]);
forward Login_Datos_pInfo(playerid);
forward Update_Datos_pInfo(playerid);
forward LimpiarConsola(playerid, lines);
forward IdentificarPass( playerid, name[ ], value[ ] );
Paso 6.- Bajo todo lo que hemos puesto, vamos a crear los Callback's (Public's) con los cuales daremos los stats iniciales, se estableceran los datos iniciales, como el VIP 0, el cual hace que no tenga vip, nivel inicial, etc...
- Código:
public Register_Datos_pInfo(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
new PlayerFile[ 13 + MAX_PLAYER_NAME ];
format( PlayerFile , sizeof PlayerFile, DirecUsuario, PlayerNombre(playerid));
GivePlayerMoney(playerid, 5000);
new INI:PlayerAcc = INI_Open( PlayerFile );
strmid(PlayerInfo[playerid][pLlave], password, 0, strlen(password), 64);
INI_WriteString(PlayerAcc, "Password", PlayerInfo[playerid][pLlave]);
INI_WriteInt( PlayerAcc, "AdminNivel", PlayerInfo[playerid][pAdmin]);
INI_WriteInt( PlayerAcc, "CuentaVip", PlayerInfo[playerid][pVip]);
INI_WriteInt( PlayerAcc, "Intentos_Spam", PlayerInfo[playerid][Intentos_Spam]);
INI_WriteInt( PlayerAcc, "Dinero", GetPlayerMoney(playerid));
printf("[Registro] %s ¡Ha Registrado su Cuenta!",PlayerNombre(playerid));
INI_Close(PlayerAcc);
INI_ParseFile( PlayerFile, "Load_Datos_pInfo", false, true, playerid, true, false );
Login_Datos_pInfo(playerid);
}
return 1;
}
public LimpiarConsola(playerid, lines)
{
if(IsPlayerConnected(playerid))
{
for(new i=0; i<lines; i++)
{
SendClientMessage(playerid, -1, " ");
}
}
return 1;
}
MostrarLogueo(playerid)
{
new title[] = "Logueo",string[512],str[128];
format(str, sizeof str, "{FFFFFF}Bienvenido, Estimado {FF0000}%s.\n\n{FFFFFF}Esta cuenta Ya esta Registrada, por Lo Tanto debes Loguearte.\n\n{FFFFFF}Escribe una contraseña en el Siguiente {00FF00}espacio:\n", PlayerNombre(playerid));
strcat(string, str);
ShowPlayerDialog(playerid, DLOGUEO, DIALOG_STYLE_INPUT, title, string, "Conectar", "Salir");
return 1;
}
MostrarRegistro(playerid)
{
new title[] = "Registro",string[512],str[128];
format(str, sizeof str, "{FFFFFF}Bienvenido, Estimado {FF0000}%s.\n\n{FFFFFF}Esta cuenta no esta Registrada, por Lo Tanto puedes registrarla y Será Tuya.\n\n{FFFFFF}para jugar en este Servidor debes Registrarte, Escribe una contraseña en el \n\n{FFFFFF}Siguiente {00FF00}espacio:", PlayerNombre(playerid));
strcat(string, str);
ShowPlayerDialog(playerid, DREGISTRO, DIALOG_STYLE_INPUT, title, string, "Registrar", "Salir");
return 1;
}
PlayerNombre(playerid)
{
new xName[ MAX_PLAYER_NAME ];
GetPlayerName( playerid, xName, sizeof( xName ) );
return xName;
}
EspacioAgregar(playerid, const string[])
{
if(IsPlayerConnected(playerid))
{
if(strfind(string, "=", true) != -1) return 0;
else if(strfind(string, "\n", true) != -1) return 0;
else return 1;
}
return 0;
}
public Login_Datos_pInfo(playerid)
{
if(PlayerInfo[playerid][Intentos_Spam] == 5)
{
LimpiarConsola(playerid, 100);
SendClientMessage(playerid, -1, " Estas baneado por spam noob adíos. ");
printf("[Baneo] El Usuario: %s Intento entrar. Pero tiene Intentos_Spam = 5. ",PlayerNombre(playerid));
Ban(playerid);
return 1;
}
if(PlayerInfo[playerid][pVip] > 0)
{
LimpiarConsola(playerid, 10);
ComprobarSiLogueo[playerid] = 1;
SendClientMessage(playerid, -1, " {FF0000}¡Bienvenido Usuario VIP! ");
printf("[Logueo] El Usuario Vip: %s se ha Logueado! ",PlayerNombre(playerid));
return 1;
}
else
LimpiarConsola(playerid, 10);
ComprobarSiLogueo[playerid] = 1;
SendClientMessage(playerid, -1, " {FF6622}¡Se ha Logueado con Exito! ");
printf("[Logueo] El Usuario: %s se ha Logueado! ",PlayerNombre(playerid));
return 1;
}
public Update_Datos_pInfo(playerid)
{
if(INI_Exist(PlayerNombre(playerid)) && gPlayerLogged[playerid] == 1)
{
new PlayerFile[ 13 + MAX_PLAYER_NAME + 1];
format( PlayerFile , sizeof PlayerFile, DirecUsuario, PlayerNombre(playerid));
new INI:PlayerAcc = INI_Open( PlayerFile );
INI_WriteInt( PlayerAcc, "AdminNivel",PlayerInfo[playerid][pAdmin]);
INI_WriteInt( PlayerAcc, "CuentaVip",PlayerInfo[playerid][pVip]);
INI_WriteInt( PlayerAcc, "Intentos_Spam",PlayerInfo[playerid][Intentos_Spam]);
INI_WriteInt( PlayerAcc, "Dinero",GetPlayerMoney(playerid));
INI_Close( PlayerAcc );
}
return 1;
}
public IdentificarPass(playerid, name[ ], value[ ])
{
if(!strcmp( name, "Password")) SetPVarString(playerid, "pContrasena", value);
}
CheckearSpam(playerid, text[])
{
new var, pos, oldpos,string[128];
oldpos = strfind(text, ".", true);
if(strval(text[oldpos - 1]) == 0) return 1;
while((pos = strfind(text, ".", true, pos + 1)) != -1 && pos - oldpos <= 4)
{
var++;
if(strval(text[pos + 1]) == 0 || text[pos + 1] == ' ')
return 1;
oldpos = pos;
if(var == 3 && (pos = strfind(text, ":", true, pos + 1)) != -1)
{
if(strval(text[pos + 1]) == 0 || text[pos + 1] == ' ')
return 1;
// Más de 4 Intentos de spam, = Baneado
if(PlayerInfo[playerid][Intentos_Spam] >= 4)
{
format(string,sizeof(string),"*** %s(ID:%d) Ha sido Baneado por Intentar hacer Spam %d Veces.",NombreJugador(playerid),playerid, PlayerInfo[playerid][Intentos_Spam]);
SendClientMessageToAll(0x9C00AFFF,string);
SendClientMessage(playerid,0xFF0000FF," =============== SPAM DETECTADO ======================== ");
SendClientMessage(playerid,-1," Usted ha sido baneado por llegar al Limite de Intentos de Spam...");
format(string,sizeof(string), " Intentos de Spam: (%d/5) - Adíos %s",PlayerInfo[playerid][Intentos_Spam], NombreJugador(playerid));
SendClientMessage(playerid, -1,string);
SendClientMessage(playerid,0xFF0000FF," ======================================================= ");
//PlayerInfo[playerid][Intentos_Spam]++;
Ban(playerid);
return 1;
} else // Pero si tiene Menós.
LimpiarConsola(playerid, 100);
PlayerInfo[playerid][Intentos_Spam]++;
format(string,sizeof(string),"*** %s(ID:%d) Ha sido Kickeado por Intentar hacer Spam ",NombreJugador(playerid),playerid, PlayerInfo[playerid][Intentos_Spam]);
SendClientMessageToAll(0x9C00AFFF,string);
SendClientMessage(playerid,0xFF0000FF," =============== SPAM DETECTADO ======================== ");
SendClientMessage(playerid,-1," Serás kickeado y si Prosigues serás Baneado por Spam. ");
format(string,sizeof(string), " Intentos de Spam: (%d/5) - No llegues a las 5...",PlayerInfo[playerid][Intentos_Spam]);
SendClientMessage(playerid, -1,string);
SendClientMessage(playerid,0xFF0000FF," ======================================================= ");
Kick(playerid);
return 0;
}
}
return 1;
}
public Load_Datos_pInfo(playerid, name[], value[])
{
INI_Int( "AdminNivel", PlayerInfo[playerid][pAdmin]);
INI_Int( "CuentaVip", PlayerInfo[playerid][pVip]);
INI_Int( "Intentos_Spam", PlayerInfo[playerid][Intentos_Spam]);
INI_Int( "Dinero", PlayerInfo[playerid][pCash] );
return 0;
}
Paso 6.- Tendremos que ir al Callback "OnPlayerDisconnect" y agregaremos lo siguiente, esto es para que los stats del jugador se actualicen cuando este se desconecte del servidor.
- Código:
Update_Datos_pInfo(playerid);
Al final quedara así
- Código:
public OnPlayerDisconnect(playerid, reason)
{
Update_Datos_pInfo(playerid);
if(!IsPlayerNPC(playerid))
{
return 1;
}
return 1;
}
Paso 7.- Volvemos a el principio del GM y bajo los includes crearemos los siguientes Defines, estos son para crear las IDs de los diálogos de registro.
- Código:
#define DLOGUEO 111
#define DREGISTRO 222
Paso 8.- Luego vamos al Callback "OnDialogResponse" y agregamos lo siguiente.
- Código:
new string[128];
if(dialogid == DLOGUEO)
{
if(response)
{
if(strlen(inputtext) == 0)
{
MostrarLogueo(playerid);
SendClientMessage(playerid, -1, " Inserte una Contraseña para Loguearse. ");
return 1;
}
new PlayerFile[ 13 + MAX_PLAYER_NAME ], PlayerPass[129];
format( PlayerFile , sizeof PlayerFile, DirecUsuario,PlayerNombre(playerid));
INI_ParseFile( PlayerFile, "IdentificarPass",.bExtra = true,.extra = playerid);
GetPVarString( playerid, "pContrasena", PlayerPass, 129);
if(!strcmp(PlayerPass, inputtext))
{
format( PlayerFile , sizeof PlayerFile, DirecUsuario, PlayerNombre(playerid));
INI_ParseFile( PlayerFile, "Load_Datos_pInfo", false, true, playerid, true, false );
Login_Datos_pInfo(playerid);
}
else
{
Camara_De_Inicio(playerid);
MostrarLogueo(playerid);
Limite_Intentos_Log[playerid] ++;
format(string, sizeof(string), " Contraseña Incorrecta, Intentos: {FF0000}(%d/3", Limite_Intentos_Log[playerid]);
SendClientMessage(playerid, -1, string);
SendClientMessage(playerid, -1, "Si has olvidado tu contraseña informalo Via Foro");
if(Limite_Intentos_Log[playerid] == 9)
{
SendClientMessage(playerid, -1, "Fuiste kickeado al exceder el límite de intentos");
Kick(playerid);
}
}
}
else
{
SendClientMessage(playerid, -1, "Si tienes problemas con loguearte contacta con un administrativo.");
Kick(playerid);
}
}
if(dialogid == DREGISTRO)
{
if (response)
{
if (sscanf(inputtext, "s[20]", inputtext[0]))
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid);
return 1;
}
if (strlen(inputtext) < 3 || strlen(inputtext) > 20 )
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid); return 1;
}
if(EspacioAgregar(playerid, inputtext) == 1)
{
Register_Datos_pInfo(playerid, inputtext);
}
else
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid);
}
}
else
{
SendClientMessage(playerid, -1, "Gracias por su estancia, le esperamos.");
Kick(playerid);
}
}
Quedara de esta manera
- Código:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new string[128];
if(dialogid == DLOGUEO)
{
if(response)
{
if(strlen(inputtext) == 0)
{
MostrarLogueo(playerid);
SendClientMessage(playerid, -1, " Inserte una Contraseña para Loguearse. ");
return 1;
}
new PlayerFile[ 13 + MAX_PLAYER_NAME ], PlayerPass[129];
format( PlayerFile , sizeof PlayerFile, DirecUsuario,PlayerNombre(playerid));
INI_ParseFile( PlayerFile, "IdentificarPass",.bExtra = true,.extra = playerid);
GetPVarString( playerid, "pContrasena", PlayerPass, 129);
if(!strcmp(PlayerPass, inputtext))
{
format( PlayerFile , sizeof PlayerFile, DirecUsuario, PlayerNombre(playerid));
INI_ParseFile( PlayerFile, "Load_Datos_pInfo", false, true, playerid, true, false );
Login_Datos_pInfo(playerid);
}
else
{
Camara_De_Inicio(playerid);
MostrarLogueo(playerid);
Limite_Intentos_Log[playerid] ++;
format(string, sizeof(string), " Contraseña Incorrecta, Intentos: {FF0000}(%d/3", Limite_Intentos_Log[playerid]);
SendClientMessage(playerid, -1, string);
SendClientMessage(playerid, -1, "Si has olvidado tu contraseña informalo Via Foro");
if(Limite_Intentos_Log[playerid] == 9)
{
SendClientMessage(playerid, -1, "Fuiste kickeado al exceder el límite de intentos");
Kick(playerid);
}
}
}
else
{
SendClientMessage(playerid, -1, "Si tienes problemas con loguearte contacta con un administrativo.");
Kick(playerid);
}
}
if(dialogid == DREGISTRO)
{
if (response)
{
if (sscanf(inputtext, "s[20]", inputtext[0]))
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid);
return 1;
}
if (strlen(inputtext) < 3 || strlen(inputtext) > 20 )
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid); return 1;
}
if(EspacioAgregar(playerid, inputtext) == 1)
{
Register_Datos_pInfo(playerid, inputtext);
}
else
{
SendClientMessage(playerid, -1, "Por favor, registre una contraseña de 3 a 20 carácteres.");
MostrarRegistro(playerid);
}
}
else
{
SendClientMessage(playerid, -1, "Gracias por su estancia, le esperamos.");
Kick(playerid);
}
}
return 1;
}
Paso 9.- Nos vamos al Callback "OnPlayerConnect" y colocamos esto
- Código:
ComprobarSiLogueo[playerid] = 0;
new string[128];
new JugadorNombre12[MAX_PLAYERS]; GetPlayerName(playerid, JugadorNombre12, sizeof(JugadorNombre12));
SetPVarString(playerid, "pContrasena", "0") ;
format(string, sizeof(string), DirecUsuario, JugadorNombre12);
if(INI_Exist(PlayerNombre(playerid)))
{
MostrarLogueo(playerid);
} else MostrarRegistro(playerid);
Quedara de esta manera
- Código:
public OnPlayerConnect(playerid)
{
ComprobarSiLogueo[playerid] = 0;
new string[128];
new JugadorNombre12[MAX_PLAYERS]; GetPlayerName(playerid, JugadorNombre12, sizeof(JugadorNombre12));
SetPVarString(playerid, "pContrasena", "0") ;
format(string, sizeof(string), DirecUsuario, JugadorNombre12);
if(INI_Exist(PlayerNombre(playerid)))
{
MostrarLogueo(playerid);
} else MostrarRegistro(playerid);
return 1;
}
Listo! Ya tienes tu propia Gamemode Roleplay desde 0, ahora lo que tienes que hacer por tu parte es hacer los comandos, los cuales subiré un aporte de los comandos esenciales para Roleplay, si te ha servido, dame un +1, eso me ayuda a crecer y me motiva para traer aún más aportes a esta gran comunidad, también ve mi firma, vienen los links de mis aportes y cursos HTML (Son links a posts de este mismo foro) Ojala te haya servido, nos vemos hasta la próxima!!!