[Tutorial] [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql]
#1

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

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
Ahora Creamos un stock para conectar con MySql

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 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

Код:
CREATE TABLE IF NOT EXISTS NombreTabla (Variable Tipo, Variable Tipo, Etc...)
Para crear la tabla usuarios seria asн:

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
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):
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
Despuйs de lo anterior, creamos el Enumerador (enum) para las variables

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 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.

pawn Код:
forward RegistrarUsuario(playerid, Nombre[], pass[]);
public RegistrarUsuario(playerid, Nombre[], pass[])
{

    return 1;
}
Para insertar un nuevo registro deberemos usar esto
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 '
Despuйs de crear el Callback anterior, le ingresamos el contenido.

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");
Luego de que tengamos listo el public y que nos funcione correctamente, nos vamos a la creaciуn del CallBack de ingreso.

pawn Код:
forward IngresarUsuario(playerid, Nombre[], pass[]);
public IngresarUsuario(playerid, Nombre[], pass[])
{

    return 1;
}
Para seleccionar un registro, usamos:

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
Cuando tengamos el CallBack, colocamos el siguiente cуdigo dentro:
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
Si quieren pueden colocar los dos siguientes cуdigo abajo de todo el main para ver si nos quedo correcto

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
Luego, en el Callback OnPlayerConnect(playerid) Colocamos:

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");
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.


Код:
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
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

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");
Luego... Nos dirijamos otra ves a OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) e ingresamos el siguiente codigo

pawn Код:
if(Dialog_Ingreso == dialogid)
    {

    }
lo cual comprobara que el dialogo que queremos manejar es el dialogo de ingreso.

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
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:

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");
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

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
nos habrб quedado algo como esto
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)
    {

    }
Le decimos al gm que el dialogo que trabajaremos es el de Registro

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);
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)

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

Un ejemplo seria, que queramos guardar la variable GeneroSexual del jugador porque en el juego, le dieron ganas de ser del sexo opuesto:

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.
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.

Quote:
format:Setea las variables a la consulta
mysql_query: Envнa la consulta

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
Reply


Messages In This Thread
[Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Nicolas_Castillo - 15.02.2012, 18:11
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by godoy32 - 15.02.2012, 20:13
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Nicolas_Castillo - 15.02.2012, 21:42
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Kurama - 27.02.2012, 00:33
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Fede.Zink - 27.02.2012, 00:47
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Nicolas_Castillo - 07.03.2012, 00:11
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by leaNN! - 08.03.2012, 16:11
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by motocros_elche - 06.11.2012, 03:30
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by -[R]hysi- - 06.11.2012, 07:08
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by NeuZz - 06.11.2012, 09:10
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Dreyfuz - 20.02.2013, 13:08
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by OTACON - 20.02.2013, 13:54
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Dreyfuz - 20.02.2013, 14:12
Re: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Soi_salva - 22.02.2013, 01:05
Re: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by xXThePiloHackXx - 02.02.2015, 04:33
Respuesta: Re: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Zume - 02.02.2015, 04:41
Respuesta: Re: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Nicolas_Castillo - 04.02.2015, 02:58
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by DesingMyCry - 04.02.2015, 03:53
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by Nicolas_Castillo - 05.02.2015, 00:30
Respuesta: [Tutorial] Realizar Un GameMode Basico Desde Cero [MySql] - by DesingMyCry - 05.02.2015, 01:12

Forum Jump:


Users browsing this thread: 6 Guest(s)