15.02.2012, 18:11
(
Последний раз редактировалось Nicolas_Castillo; 27.02.2012 в 13:15.
Причина: Actualizacion
)
Este tutorial se ah realizado en tiempo real, es decir, mientras se realizaba el script y se hacнan las pruebas, se fue creando el tuto
En esta ocacion, os traigo la sabidurнa que tengo en este tutorial.
Para empezar, tendremos que descargarnos dos cosas.
Wamp Server Con esto podremos administrar la base de datos
Plugin MySql Necesario para poder realizar el GameMode
Empecemos con la Acciуn!
Si no saben crear una Base De Datos , abran el siguiente spoiler.
Luego de instalar el Wamp Server, Lo iniciamos Dбndole doble clic al icono.
Luego nos dirigimos al icono que aparece en nuestra barra de tareas, y le damos clic izquierdo
Despuйs les saldrб un menъ, y deberбn Darle donde dice phpmyadmin
Os saldrб una nueva ventana en su navegador preferido.
Denle clic en donde dice base de datos.
Donde dice Crear nueva base de datos abajo colocamos el nombre y lo dejamos en Cortejamiento
Para este tutorial, usaremos el nombre Testing
Cuando hayamos creado la DB satisfactoriamente le damos click en el nombre que aparecerб segundos despuйs que la creamos.
Con lo anterior, ya tendremos nuestra Base de datos, para las tablas, el GameMode que crearemos se encargara de eso.
Recuerden que en server.cfg deberбn colocar : plugins mysql
Comencemos con abrir pawno.exe y darle al botуn new
Luego de eso, borraremos lo que no nos interesa, osea, la parte de FilterScript.
Colocamos la definiciуn del include mysql en la parte de arriba.
Despuйs definiremos un par de variables o defines, como ustedes quieran para la configuraciуn del MySql.
Ahora Creamos un stock para conectar con MySql
Cuando hayamos echo el stock nos dirigimos a main() y en todo el principio colocaremos ConectarMySQL();
Cuando ya tengamos listo lo anterior, abrimos el servidor y comprobamos en la consola si la conexiуn fue satisfactoria o no, si no funciona, comenta y tratare de solucionar tu error.
Ahora, para realizar una tabla, en la cual guardaremos los usuarios, usaremos mysql_query que realizara la consulta.
Recuerden que primero se debe conectara con mysql mediante la funciуn que creamos mas arriba, si no se conecta, lo demбs como mysql_query, no funcionara. Entonces lo colocaremos despuйs de ConectarMySQL(); en el main()
Para la creaciуn de una tabla usaremos
Para crear la tabla usuarios seria asн:
Recomiendo que luego, si queremos aсadir mas variable, creemos otro mysql_query pero con otro contenido, por que si agregamos muchas variables en un mismo mysql_query nos generara un error (Recomiendo 3 variables por consulta):
Despuйs de lo anterior, creamos el Enumerador (enum) para las variables
Si nos salio bien el cуdigo de arriba, iniciamos el servidor, y ya tendremos listo nuestra tabla para guardar los registros de los usuarios.
Si no os sale la tabla, postea al error que te da y trataremos de solucionarlo(en Debug.txt que sale en la carpeta del servidor, nos dice si la consulta fue satisfactoria o si fue erronea)
Okay, ahora que ya nos conecta a mysql satisfactoriamente, y ya tenemos la tabla creada, es hora de crear los registros e ingresos para los usuarios.
Primeros creamos un nuevo Callback para el registro del usuario.
Para insertar un nuevo registro deberemos usar esto
Despuйs de crear el Callback anterior, le ingresamos el contenido.
Luego de que tengamos listo el public y que nos funcione correctamente, nos vamos a la creaciуn del CallBack de ingreso.
Para seleccionar un registro, usamos:
Cuando tengamos el CallBack, colocamos el siguiente cуdigo dentro:
Si quieren pueden colocar los dos siguientes cуdigo abajo de todo el main para ver si nos quedo correcto
Ya que tenemos listo los dos Callbakc, el de ingreso y el de registro, vamos a crear los Diбlogos que nos pedirбn los datos.
Para un mejor manejo de los dialogos, definiremos los dialogid mediante un define
Luego, en el Callback OnPlayerConnect(playerid) Colocamos:
Lo cual nos mostrarнa una lista de 2 items para escoger, uno para registrar una nueva cuenta, y otro para ingresar en una nueva cuenta.
Si nos sale bien el dialogo, lo siguiente seria hacer el script, para que cuando elijan un item, los lleve al dialogo correspondiente.
Nos dirijimos a OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) e ingresamos el siguiente codigo
dentro de la parte de ingreso, colocamos el siguiente cуdigo, para que nos muestre el Dialogo para ingresar el nombre de la cuenta
Luego... Nos dirijamos otra ves a OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) e ingresamos el siguiente codigo
lo cual comprobara que el dialogo que queremos manejar es el dialogo de ingreso.
Dentro del anterior cуdigo, colocamos
Luego nos volvemos al CallBack IngresarUsuario y donde esta la parte de que la contra es incorrecta, osea, donde tenemos el printf que decia Alguien NO ingreso correctamente
colocamos esto:
Que seria para que volvieran al dialogo de ingreso si la contraseсa es incorrecta.
Ya tenemos listo la parte del ingreso, ahora nos dirigiremos a la parte de Registro.
Bбsicamente es casi lo mismo que con el ingreso, no necesitamos mayor cosa.
Agregamos el siguiente codigo a la parte de Registro
nos habrб quedado algo como esto
Con lo siguiente...
Le decimos al gm que el dialogo que trabajaremos es el de Registro
dentro de eso colocaremos:
y LISTO, ya tendremos nuestro primer GameMode realizado de cero y con MySQL.
Actualizacion: Aсadido el guardado de datos al desconectarse. [25/02/2012]
Con lo siguiente podrбn guardar en una tabla las variables al desconectarse.
El siguiente cуdigo sirve para lo anterio, deberan colocarlo en el public OnPlayerDisconnectr. (Lo que dije lineas arriba)
Un ejemplo seria, que queramos guardar la variable GeneroSexual del jugador porque en el juego, le dieron ganas de ser del sexo opuesto:
Si en ves de guardar un Texto, lo que quieren guardar es un numero, cambien SET `NombreVariable` = '%s' por esto SET `NombreVariable` = '%d', ven que cambiamos el %s, por %d, puesto que el %s recibe variables tipo String, y el %d, tipo int. Para un Float, seria %f.
El GameMode que se ah creado mediante este tutorial, funciona correctamente, no se posteara el Gm, para que aprendas MySql y no te hagas el vago solo modificandolo.
Creditos
Del Tutorial: Solamente mio
De los Cуdigos: De sus respectivos creadores
Bienvenidos a mi Tutorial Aun mas 'Gratuito' que los anteriores
En esta ocacion, os traigo la sabidurнa que tengo en este tutorial.
Para empezar, tendremos que descargarnos dos cosas.
Wamp Server Con esto podremos administrar la base de datos
Plugin MySql Necesario para poder realizar el GameMode
Empecemos con la Acciуn!
Si no saben crear una Base De Datos , abran el siguiente spoiler.
Luego de instalar el Wamp Server, Lo iniciamos Dбndole doble clic al icono.
Luego nos dirigimos al icono que aparece en nuestra barra de tareas, y le damos clic izquierdo
Despuйs les saldrб un menъ, y deberбn Darle donde dice phpmyadmin
Os saldrб una nueva ventana en su navegador preferido.
Denle clic en donde dice base de datos.
Donde dice Crear nueva base de datos abajo colocamos el nombre y lo dejamos en Cortejamiento
Para este tutorial, usaremos el nombre Testing
Cuando hayamos creado la DB satisfactoriamente le damos click en el nombre que aparecerб segundos despuйs que la creamos.
Con lo anterior, ya tendremos nuestra Base de datos, para las tablas, el GameMode que crearemos se encargara de eso.
Recuerden que en server.cfg deberбn colocar : plugins mysql
Comencemos con abrir pawno.exe y darle al botуn new
Luego de eso, borraremos lo que no nos interesa, osea, la parte de FilterScript.
Colocamos la definiciуn del include mysql en la parte de arriba.
pawn Код:
#include <mysql>
Despuйs definiremos un par de variables o defines, como ustedes quieran para la configuraciуn del MySql.
pawn Код:
#define SQL_HOST "localhost"
#define SQL_USER "root"
#define SQL_PASS ""
#define SQL_DB "basetest"
Код:
SQL_HOST: Con esto, conectaremos a la ip del servidor que tiene el MySql, como usamos nuestro PC, colocamos localhost SQL_USER: Pues el Usuario del MySql SQL_PASS: La contraseсa del Usuario SQL_DB: Pues la Base de Datos que usaremos
pawn Код:
stock ConectarMySQL()
{
mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
mysql_debug(1);
if(mysql_ping() == 1)
{
printf("\t\t[MYSQL]: Conexion Satisfactoria (DataBase: '%s')\n", SQL_DB);
}
else
{
printf("\t\t[MYSQL]: ERROR. Conexion Fallida (DataBase: '%s')\n", SQL_DB);
SendRconCommand("exit");
}
return 1;
}
Код:
mysql_connect: Nos conectara con la base de datos. mysql_debug(1);: Con esto le estaremos diciendo al include/plugin que nos genere un archivos de texto, para todas las consultas que se realicen, por si da error, o para saber si se ejecuto bien mysql_ping(): nos revisa si nos conectamos o no.
Cuando ya tengamos listo lo anterior, abrimos el servidor y comprobamos en la consola si la conexiуn fue satisfactoria o no, si no funciona, comenta y tratare de solucionar tu error.
Ahora, para realizar una tabla, en la cual guardaremos los usuarios, usaremos mysql_query que realizara la consulta.
Recuerden que primero se debe conectara con mysql mediante la funciуn que creamos mas arriba, si no se conecta, lo demбs como mysql_query, no funcionara. Entonces lo colocaremos despuйs de ConectarMySQL(); en el main()
Para la creaciуn de una tabla usaremos
Код:
CREATE TABLE IF NOT EXISTS NombreTabla (Variable Tipo, Variable Tipo, Etc...)
pawn Код:
mysql_query("CREATE TABLE IF NOT EXISTS users (Id_User INT(5) NOT NULL AUTO_INCREMENT, Nick VARCHAR(34) NOT NULL, Pass VARCHAR(34) NOT NULL, PRIMARY KEY (Id_User))");
Код:
CREATE TABLE IF NOT EXISTS: Nos creara la tabla, si esta misma no existe. INT - VARCHAR: Con esto definimos el tipo de variable que se creara. AUTO_INCREMENT: Con esto definiremos que la variable Id_User espesara de 1, y por cada registro que se ejecute, sumara +1 al nuevo. Es como para tener control NOT NULL: Es para decirle a MySql, que esta variable no estarб Nula
pawn Код:
mysql_query("ALTER TABLE users ADD GeneroSexual VARCHAR(50) NOT NULL");
Код:
ALTER TABLE: Nos indica que queremos modifica una tabla ADD: Para agregar una nueva variable a la tabla
pawn Код:
enum Informacion
{
Nick[MAX_PLAYER_NAME],
Pass[34],
GeneroSexual[20],
};
new Users[MAX_PLAYERS][Informacion];
new NombreNick[MAX_PLAYERS][MAX_PLAYER_NAME]
Код:
El NombreNick, Se usara para guardar el nombre, mas adelante verбn el porque.
Si no os sale la tabla, postea al error que te da y trataremos de solucionarlo(en Debug.txt que sale en la carpeta del servidor, nos dice si la consulta fue satisfactoria o si fue erronea)
Okay, ahora que ya nos conecta a mysql satisfactoriamente, y ya tenemos la tabla creada, es hora de crear los registros e ingresos para los usuarios.
Primeros creamos un nuevo Callback para el registro del usuario.
pawn Код:
forward RegistrarUsuario(playerid, Nombre[], pass[]);
public RegistrarUsuario(playerid, Nombre[], pass[])
{
return 1;
}
pawn Код:
INSERT INTO `users` (`Nick`, `Pass`) VALUES ([value-Nick],[value-Pass])
Код:
INSERT INTO: Le dice a mysql que queremos insertar nuevos valores a la tabla `users`: Nombre de la tabla a la que queremos insertar (`Nick`, `Pass`, `GeneroSexual`) : Estamos diciendo que esos son los valores que queremos insertar VALUES : Le dice a mysql que lo que viene son los valores a las variables anteriores ([value-Nick],[value-Pass],[value-GeneroSexual]): Son las variables que iran dentro de comillas simples '
pawn Код:
new Insertar[256];
format(Insertar, 256, "INSERT INTO users (Nick, Pass) VALUES ('%s', '%s')", Nombre, pass);
mysql_query(Insertar);
printf("\t\t[MYSQL]: Cuenta Creada Satisfactoriamente. (Nombre, '%s' )", Nombre);
SendClientMessage(playerid, 0xFFFFFFff, " Tu cuenta ha sido creada satisfactoriamente");
Код:
Insertar: Sera la variable que contendrб la consulta format: Sera la funciуn que nos meterб las variables de Nombre, pass y sexo en la consulta mysql_query: Realizara la consulta printf: Nos mandara un mensaje con los datos, menos la pass del registro nuevo
Код:
Podrian colocar el siguiente codigo, al final del main, y si les genera la consulta correctamente, tendran listo el public RegistrarUsuario(0, "Politicos", "Idiotas");
pawn Код:
forward IngresarUsuario(playerid, Nombre[], pass[]);
public IngresarUsuario(playerid, Nombre[], pass[])
{
return 1;
}
pawn Код:
SELECT * FROM users WHERE Nick = 'Valor' AND Pass = 'Valor'
Код:
SELECT * FROM users: Le dice a mysql que vamos a Seleccionar (SELECT) todo (*) Desde (FROM) la tabla users WHERE Nick = 'Valor' : Con esto le diremos que con solo si los siguientes parбmetros son correctos AND Pass = 'Valor': Le dice a mysql que tanto como la variable Nick y(AND) la variable pass, deben de estar como se lo indicamos
pawn Код:
new Insertar[256], GuardarStr[100];
format(Insertar, 256, "SELECT * FROM users WHERE Nick = '%s' AND Pass = '%s'", Nombre, pass);
mysql_query(Insertar);
mysql_store_result();
if(mysql_num_rows() != 0)
{
while(mysql_fetch_row_format(Insertar,"|"))
{
mysql_fetch_field_row(GuardarStr, "Nick");strmid(Users[playerid][Nick], GuardarStr, 0, strlen(GuardarStr), 255);
mysql_fetch_field_row(GuardarStr, "Pass");strmid(Users[playerid][Pass], GuardarStr, 0, strlen(GuardarStr), 255);
mysql_fetch_field_row(GuardarStr, "GeneroSexual");strmid(Users[playerid][GeneroSexual], GuardarStr, 0, strlen(GuardarStr), 255);
mysql_free_result();
}
SetPlayerName(playerid, Users[playerid][Nick]);
printf(" Alguien a ingresado correctamente" );
}
else
{
SendClientMessage(playerid, 0xFFFFFFff, " Tu nombre o Contraseсa Son incorrectos, o no existen en nuestra Base");
printf(" Alguien NO ingreso correctamente" );
}
Код:
Insertar: Guardara la Consulta GuardarStr: Nos guardara los datos que saquemos en las variables del jugador format: Nos metera las variables de Nombre y pass en la consulta mysql_query: Realizara la consulta mysql_store_result(): Nos guardara los datos que saquemos de la consulta if(mysql_num_rows() != 0): Si los datos no son correctos, la consulta nos devolverб Cero columnas y si es diferente a cero, el ingreso fue exitoso mysql_fetch_row_format(Insertar,"|"): Cuando sacamos los datos de la consulta, el formato es algo como esto: Variable|Otra Variable|Otra|Etc... mysql_fetch_field_row: No guardara en el primer parбmetro lo que saquemos del segundo parбmetro strmid: Nos insertara en la variable del jugador, lo que guardamos en el anterior item SetPlayerName: Le coloca el Nombre al jugador
pawn Код:
IngresarUsuario(0, "Politicos", "Idiotas");
IngresarUsuario(0, "Politicos", "NoIdiotas");
Ya que tenemos listo los dos Callbakc, el de ingreso y el de registro, vamos a crear los Diбlogos que nos pedirбn los datos.
Para un mejor manejo de los dialogos, definiremos los dialogid mediante un define
pawn Код:
#define Dialog_Ingreso 001
#define Dialog_Registro 002
#define Dialog_Sexual 003
#define Dialog_IngReg 004
pawn Код:
new NombreE[MAX_PLAYER_NAME];
GetPlayerName(playerid, NombreE, sizeof(NombreE));
strmid(NombreNick[playerid], NombreE, 0, strlen(NombreE), 255);
ShowPlayerDialog(playerid, Dialog_IngReg, DIALOG_STYLE_LIST, " Registro o Ingreso", " >< Ingresar\n >< Registrar", "Aceptar", "Salir");
Код:
El GetPlayerName, almacenara el nombre en la variable NombreE y con el strmid lo meteremos es la variable NombreNick, ya muy pronto sabrбn el porque
Nos dirijimos a OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) e ingresamos el siguiente codigo
pawn Код:
if(!response) return Kick(playerid); // Esto sera por si dan salir, los kickeamos
if(Dialog_IngReg == dialogid)
{
if(listitem == 0) // Ingreso
{
}
else if(listitem == 1) // Registro
{
}
}
dentro de la parte de ingreso, colocamos el siguiente cуdigo, para que nos muestre el Dialogo para ingresar el nombre de la cuenta
pawn Код:
ShowPlayerDialog(playerid, Dialog_Ingreso, DIALOG_STYLE_INPUT, "Ingresar", "Por favor, en el siguiente campo, coloca la contraseсa de la cuenta a la cual quieres ingresar", "Siguiente", "Volver");
pawn Код:
if(Dialog_Ingreso == dialogid)
{
}
Dentro del anterior cуdigo, colocamos
pawn Код:
if(!response) return ShowPlayerDialog(playerid, Dialog_IngReg, DIALOG_STYLE_LIST, " Registro o Ingreso", " >< Ingresar\n >< Registrar", "Aceptar", "Salir");
IngresarUsuario(playerid, NombreNick[playerid], inputtext);
Код:
!response: Si no respondio al dialogo, o le dio al boton 'Volver' nos enviara al dialogo de Ingresar o Registrar IngresarUsuario: Llamariamos al callback que anteriormente creamos para ingresar al jugador
Код:
Ahora ven para lo que usamos NombreNick, para ingresar el usuario, mas adelante, otro usos como para registrar, y hacer update a la cuenta sin causar bugs
colocamos esto:
pawn Код:
ShowPlayerDialog(playerid, Dialog_Ingreso, DIALOG_STYLE_INPUT, "Ingresar", "Por favor, en el siguiente campo, coloca la contraseсa de la cuenta a la cual quieres ingresar\n Contraseсa Incorrecta", "Siguiente", "Volver");
Ya tenemos listo la parte del ingreso, ahora nos dirigiremos a la parte de Registro.
Bбsicamente es casi lo mismo que con el ingreso, no necesitamos mayor cosa.
Agregamos el siguiente codigo a la parte de Registro
pawn Код:
new Comprobar[256];
format(Comprobar, 256, "SELECT * FROM users WHERE Nick = '%s'", NombreNick);
mysql_query(Comprobar);
mysql_store_result();
if(mysql_num_rows() == 0)
{
ShowPlayerDialog(playerid, Dialog_Registro, DIALOG_STYLE_INPUT, "Registrar", "Por favor, ingresa la contraseсa para tu cuenta", "Siguiente", "Volver");
}
else
{
SendClientMessage(playerid, 0xffffffff, " Tu nombre ya esta registrado, por favor, ahora ingresa a tu cuenta");
ShowPlayerDialog(playerid, Dialog_Ingreso, DIALOG_STYLE_INPUT, "Ingresar", "Por favor, en el siguiente campo, coloca la contraseсa de la cuenta a la cual quieres ingresar", "Siguiente", "Volver");
}
Код:
Comprobar: Sera la variable que tendrб la consulta format: La funcion queingresa a la variable Comprobar la consulta para ver si ya existe un usuario con ese nombre registrado mysql_query: Enviara la consulta mysql_store_result(): Guardara el resultado de la consulta mysql_num_rows() == 0: Si no existe ningъn usuario, nos mandara cero columnas y el usuario podra registrarse Lo que esta entre el else: Sera lo que mandara al user a ingresar, en ves de a registrarse
pawn Код:
if(Dialog_IngReg == dialogid)
{
if(listitem == 0) // Ingreso
{
ShowPlayerDialog(playerid, Dialog_Ingreso, DIALOG_STYLE_INPUT, "Ingresar", "Por favor, en el siguiente campo, coloca la contraseсa de la cuenta a la cual quieres ingresar", "Siguiente", "Volver");
}
else if(listitem == 1) // Registro
{
new Comprobar[256];
format(Comprobar, 256, "SELECT * FROM users WHERE Nick = '%s'", NombreNick[playerid]);
mysql_query(Comprobar);
mysql_store_result();
if(mysql_num_rows() == 0)
{
ShowPlayerDialog(playerid, Dialog_Registro, DIALOG_STYLE_INPUT, "Registrar", "Por favor, ingresa la contraseсa para tu cuenta", "Siguiente", "Volver");
}
else
{
SendClientMessage(playerid, 0xffffffff, " Tu nombre ya esta registrado, por favor, ahora ingresa a tu cuenta");
ShowPlayerDialog(playerid, Dialog_Ingreso, DIALOG_STYLE_INPUT, "Ingresar", "Por favor, en el siguiente campo, coloca la contraseсa de la cuenta a la cual quieres ingresar", "Siguiente", "Volver");
}
}
}
Con lo siguiente...
pawn Код:
if(Dialog_Registro == dialogid)
{
}
dentro de eso colocaremos:
pawn Код:
if(!response) return ShowPlayerDialog(playerid, Dialog_IngReg, DIALOG_STYLE_LIST, " Registro o Ingreso", " >< Ingresar\n >< Registrar", "Aceptar", "Salir");
RegistrarUsuario(playerid, NombreNick[playerid], inputtext);
Actualizacion: Aсadido el guardado de datos al desconectarse. [25/02/2012]
Con lo siguiente podrбn guardar en una tabla las variables al desconectarse.
El siguiente cуdigo sirve para lo anterio, deberan colocarlo en el public OnPlayerDisconnectr. (Lo que dije lineas arriba)
Quote:
UPDATE `tabla` SET `Variable` = 'Valor' WHERE `Nick` = 'NombreUser' |
Quote:
UPDATE: Le decimos a MySql que queremos Modificar(Yo le digo Updatear) una tabla elejida SET `Variable` = 'Valor': Le diremos a MySql, que setearemos en una variable un valor. WHERE `Nick` = 'NombreUser':Le decimos que el valor updateado tendra que ser del usuario que escogemos |
pawn Код:
new updateInt[256];
format(updateInt, sizeof(updateInt), "UPDATE `users` SET `GeneroSexual` = '%s' WHERE `Nick` = '%s'", Users[playerid][GeneroSexual], NombreNick[playerid]);
mysql_query(updateInt);
Код:
El NombreNick lo usamos, por que cuando uno se desconecta, y queremos guardar los datos, debemos saber el nombre del usuario, pero al usar GetPlayerName, no obtendremos nada, dado que el usuario ya esta desconectado, en cambio, como el nombre ya estaba guardado en la variable NombreNick, las variables se guardaran correctamente, y no tendremos la necesidad de crear un public que se repita para guardar las variables.
Quote:
format:Setea las variables a la consulta mysql_query: Envнa la consulta |
Creditos
Del Tutorial: Solamente mio
De los Cуdigos: De sus respectivos creadores