[Tutorial] Sistema de Registro en MySQL [Consultas enlazadas + Whirlpool]
#1

Explicaciуn de este post
Este es oficialmente mi primer tutorial en este foro. Realizo este tutorial ya que el tutorial de newbienoob, en el cual me he basado inicialmente, no se actualizarб mбs ya que el dejу SA-MP, perjudicando en este sentido a la comunidad ya que al ser actualizado el plugin MySQL, su tutorial quedarнa obsoleto. Este tutorial trabaja con la ъltima versiуn MySQL a la fecha, la R39. Aquн aprenderemos a crear un sistema de login y registro y a guardar y posteriormente cargar los datos.

El tutorial ha sido creado por Overhaul pero yo me he tomado la molestia de traducirlo para ver si alguien crea un Gamemode MySQL desde cero y deja de usar Nexus o un Gm descargado y el ъltimo tutorial en espaсol es de una versiуn muy antigua (R7).

Archivos necesarios
- La ъltima versiуn del plugin MySQL (GitHub).
- La ъltima versiуn del plugin Whirlpool (Tema del foro).
- La ъltima versiуn XAMPP (Apache friends/XAMPP).

Es recomendable ademбs revisar la Wiki de MySQL en SA-MP para informaciуn adicional con respecto a las funciones MySQL disponibles en el plugin: https://sampwiki.blast.hk/wiki/MySQL/R33.

Tabla de contenido
  • Creaciуn de la base de datos (XAMPP) ;
  • Creaciуn de nuestro script ;
  • Epнlogo
Creaciуn de la base de datos
No voy a explicar quй es XAMPP exactamente, pueden buscarlo en Wikipedia o en la red, pero bбsicamente es un programa que nos proporcionarб el servidor para subir nuestra base de datos y manejarla mediante PHPMyAdmin.
Debes saber que los procesos del XAMPP se inician mediante el archivo xampp-control.exe.
Nota extra: las imбgenes mostradas en este tutorial se muestran en miniatura. Clic en una para ampliarla.

Cuando abrimos XAMPP mediante el archivo xampp-control.exe, veremos la siguiente ventana:

Para este tutorial (Y para SA:MP), sуlo necesitaremos dos mуdulos: Apache y MySQL. Siйntete libre de mirar los otros mуdulos, pero no los utilizaremos en este caso.

Para iniciar los mуdulos de Apache y MySQL debemos presionar el botуn 'start' bajo el subtнtulo 'actions'.
Apache trabaja en los puertos 80 y 443. Skype puede interferir en estos puertos al igual que otras aplicaciones. Explicarй como puedes iniciar Skype y Apache en la secciуn de Preguntas Frecuentes.


Todo en orden! El siguiente paso es crear nuestra base de datos y las tablas necesarias. Para ello, simplemente hacemos clic en 'Admin' en el mуdulo MySQL.


Tu navegador predeterminado te llevarб al PHPMyAdmin de tu servidor MySQL (localhost/phpmyadmin).

(Texto 1: Estas son todas tus bases de datos | Texto 2: Haz clic aquн para administrar tus bases de datos y crear una nueva)

Obviamente no vamos a usar todas las opciones PHPMyAdmin en este tutorial. Por ahora sуlo debemos crear una base de datos. Hay dos mйtodos - fбcilmente visible - siendo uno de ellos el botуn "nuevo" en la barra lateral izquierda y el segundo estб en la pestaсa "bases de datos". El botуn "nuevo" vuelve a dirigir a la pestaсa 'bases de datos' de todos modos, asн que no importa que opciуn elijamos.


Ponle un nombre a tu base de datos, selecciona en modo cotejamiento 'UTF-8_GENERAL_CI' (para habilitar los carбcteres en espaсol como tнldes) y has clic en crear. Esto agregarб tu base de datos a la barra lateral izquierda entre el resto de las bases de datos. En este tutorial vamos a llamar a nuestra base de datos "myserver", pero puedes ponerle como quieras, solo procura cambiar el nombre mбs adelante en las lнneas del tutorial para poder conectarte.

ЎHemos creado nuestra base de datos correctamente! Pero no hemos terminado todavнa. El siguiente paso es crear tablas individuales en nuestra base de datos para organizar nuestros datos (datos de Jugadores, vehнculos, casas, trabajos, armas, etc). Esto se puede hacer haciendo clic en nuestra base de datos en la barra lateral izquierda.


Para crear una tabla debemos insertar una cierta cantidad mнnima de columnas. Para realizar este tutorial, creamos una tabla llamada 'accounts' la cual va a almacenar los datos de la cuenta del jugador.


Para nъmeros enteros usa el tipo de estructura (INT).
Para strings o texto usa el tipo de estructura (VARCHAR).
Para floats o decimales usa el tipo de estructura (FLOAT).


El script bбsico para registro / login necesita un mнnimo de 10 columnas (+ 1 para el rango VIP): El ID de base de datos para el jugador (que vamos a utilizar para enlazar otras tablas con este usuario), el nombre del jugador, la contraseсa del jugador, la IP del jugador, el rango de administrador del jugador, el rango VIP del jugador, el dinero del jugador y la posiciуn del jugador (X, Y, Z, A). Dale en continuar y aсade las columnas restantes a tu tabla de datos (hasta tener las 11 columnas).


Asegъrate que la columna 'ID' la has colocado como 'PRIMARIA' y la marcaste como A_I (AUTO_INCREMENT). Bбsicamente vamos a utilizar la columna ID para identificar al jugador en la base de datos y para cada nuevo registro, el identificador sube uno por uno cuando alguien se registra. Por ejemplo: Hice la primera cuenta en el servidor, mi ID de base de datos es ahora 1. Usted hace su cuenta despuйs de mi, tu ID serб 2. Has clic en "Guardar" cuando estйs listo para pasar a la parte de secuencias de comandos de este tutorial.

ЎHemos creado la base de datos correctamente! Ahora, es tiempo de darle un uso en SA:MP.

Creaciуn de nuestro script
Lo que se muestra a continuaciуn es recomendable hacerlo en un script limpio: File> new.
Necesitaremos dos includes bбsicos para hacer un servidor con MySQL: Obviamente el include a_samp y el include a_mysql. Empezaremos con la incluciуn de ambos.

PHP код:
#include <a_samp>
#include <a_mysql> 
El segundo paso es introducir nuestros datos en los ajustes de configuraciуn para que nuestro servidor pueda conectarse a la base de datos MySQL. Esto lo hacemos con la ayuda de define - ЎEsto hace que la ediciуn de los ajustes mбs rбpida y fбcil!

PHP код:
#define     MYSQL_HOST        "localhost" //Nuestro host MySQL 
#define    MYSQL_USER        "root" //El usuario MySQL
#define    MYSQL_DATABASE    "myserver" //El nombre que le dimos a nuestra base de datos anteriormente
#define    MYSQL_PASSWORD    "" //La contraseсa del servidor MySQL, dejala en blanco 
Para los diбlogos de registro / login, decidн no usar define sino una enumeraciуn. Este mйtodo evita las colisiones de identificaciуn de diбlogo, lo que significa que usted no tiene que asignar un ID a cada diбlogo que realice.

PHP код:
enum
{
    
LoginDialog,
    
RegisterDialog
}; 
Por supuesto que tenemos que asegurarnos de que el script reconoce nuestra base de datos. Para ello, tenemos que crear una variable que contendrб los datos de conexiуn. Esta variable es global.

PHP код:
new
    
mysql
Encriptar las contraseсas de los usuarios es una obligaciуn (De hecho, es ilegal si no lo hacemos). Para proteger las contraseсas de nuestros usuarios, utilizamos un mйtodo hash llamado 'Whirlpool'. Lo mejor es aсadir este nativo bajo los includes.

PHP код:
native WP_Hash(buffer[], len, const str[]); 
Ahora debemos crear el enum de los datos del jugador. Asumirй que sabes quй es un enum y cуmo usarlo. Puede personalizar usted mismo la enumeraciуn; aсadir mбs datos, cambiar los nombres de los enumeradores, etc ....

PHP код:
enum PlayerData
{
    
ID,
    
Name[MAX_PLAYER_NAME],
    
Password[129],
    
IP[16],
    
Admin,
    
VIP,
    
Money,
    
Float:posX,
    
Float:posY,
    
Float:posZ,
    
Float:posA
};
new 
Player[MAX_PLAYERS][PlayerData]; 
Debes reconocer estos enumeradores de antes. Estos son tambiйn los nombres de nuestras columnas! Estб bien. Nombramos los enumeradores despuйs de las columnas de nuestra base de datos para evitar la complejidad y la confusiуn que puede traer.

El campo ID se utiliza para almacenar el ID de la base de datos del jugador.
El campo nombre se utilizarб para almacenar el nombre del jugador.
El campo contraseсa se utiliza para almacenar la contraseсa del jugador.
El campo IP se utilizarб para almacenar la direcciуn IP del jugador.
El campo de administraciуn se utiliza para almacenar el nivel de administrador del jugador.
El campo VIP se utiliza para almacenar nivel VIP del jugador.
El campo El dinero serб utilizado para almacenar el dinero del jugador.
El campo PosX se utiliza para almacenar el X-posiciуn del jugador.
El campo PosY se utiliza para almacenar el Y-posiciуn del jugador.
El campo PosZ se utiliza para almacenar el Z-posiciуn del jugador.
El campo Posб se utiliza para almacenar el бngulo de orientaciуn del jugador.

Hasta este punto, en realidad no hemos conectado a la base de datos todavнa. La conexiуn sucede en OnGameModeInit. Por Quй? Porque nos gustarнa cargar todos los datos (no relacionados con el jugador) cuando el modo de juego inicializa. Utilizamos el siguiente cуdigo para hacerlo:

PHP код:
public OnGameModeInit()
{
    
mysql_log(LOG_ALL);
    
mysql mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_DATABASEMYSQL_PASSWORD);
    if(
mysql_errno() != 0)
    {
        
printf("[MySQL] La conexiуn no se ha podido realizar.");
                
SendRconCommand("exit"); // cerramos el servidor para evitar problemas
    
}
    else
    {
        
printf("[MySQL] La conexiуn se ha realizado correctamente.");
    }
    return 
true;

Bбsicamente podemos registrar todo lo que tiene que ver con MySQL mediante el uso de la funciуn mysql_log, registramos todo mediante el parбmetro (LOG_ALL). Despuйs de eso, nos conectamos con nuestra base de datos MySQL. Recuerdas la variable global que ibamos a usar? La usaremos para almacenar nuestra conexiуn aquн. Asignamos esa variable global para nuestra conexiуn.
mysql_errno comprobarб si hay algъn error. La sentencia if es la siguiente: "si hay errores decir que la conexiуn falla y apagar el servidor, else dice que la conexiуn se ha realizado correctamente".

El siguiente paso es cargar los datos de un jugador cuando se conecta (para decidir si estб o no registrado). Hacemos esto mediante el uso de consultas enlazadas. Las consultas pueden ser visualizadas como una lнnea de clientes esperando a entregar sus datos. Enlazamos estas consultas para asegurar los datos que van desde el servidor hasat la base de datos MySQL.

PHP код:
public OnPlayerConnect(playerid)
{
    new
        
query[128],
        
playername[MAX_PLAYER_NAME];
        
    
GetPlayerName(playeridplayernamesizeof(playername));
    
mysql_format(mysqlquerysizeof(query), "SELECT `Password`, `ID` FROM `accounts` WHERE `Name` = '%e' LIMIT 1"playername);
    
mysql_tquery(mysqlquery"OnAccountCheck""i"playerid);
    return 
true;

Comenzamos declarando algunas variables que vamos a utilizar dentro de la callback OnAccountCheck. Usamos la variable de consulta como nuestra variable de formato. Se usу la variable playername para guardar el nombre del jugador y ver si su cuenta existe.
Continuamos por la recuperaciуn de los datos, no usamos el formato habitual por diversas razones: una es el especificador '% e' que escapa a las cadenas (de modo que el cуdigo de MySQL puede ser vulnerado y terminar en exploits). La lнnea de MySQL se explica por sн bastante: Selecciona la columna de la contraseсa y la columna de ID de la columna de las cuentas DONDE el nombre tiene un valor de '% e' que es en este caso el nombre del jugador y limita los resultados a 1 entrada .
A continuaciуn se llama la funciуn 'OnAccountCheck' - en la forma de una consulta enlazada.

PHP код:
forward OnAccountCheck(playerid);
public 
OnAccountCheck(playerid)
{
    new
        
rows,
        
fields;
    
cache_get_data(rowsfieldsmysql);
    
    if(
rows)
    {
        
cache_get_field_content(0"Password"Player[playerid][Password], mysql129);
        
Player[playerid][ID] = cache_get_field_content_int(0"ID");
        
ShowPlayerDialog(playeridLoginDialogDIALOG_STYLE_INPUT"Login""Bienvenido!\nTu cuenta estб registrada en nuestra base de datos. Por favor, ingresa tu contraeсa:""Login""Salir");
    }
    else
    {
        
ShowPlayerDialog(playeridRegisterDialogDIALOG_STYLE_INPUT"Registro""Bienvenido!\nTu cuenta no estб registrada en nuestro servidor. Ingresa la contraseсa que deseas usar:""Registrarse""Salir");
    }
    return 
true;

Comenzaremos llamando la funcion OnAccountCheck con playerid como parбmetro. A continuaciуn, definimos dos variables; filas y campos. Filas sostendrбn la cantidad de filas devueltas por la consulta bajo OnPlayerConnect, los campos van a hacer exactamente lo mismo, pero luego de las filas. La sentencia if se traduce en: si las filas no es igual a cero, entonces recuperar el valor en la columna de la contraseсa de esa fila y asignar jugador [playerid] [Contraseсa] para йl. Entonces se le asignarб al jugador [playerid] [ID] el valor que nos arrojу la consulta "ID" de esa fila. Cuando se hace eso se mostrarб el diбlogo al jugador pidiйndole que inicie sesiуn en el servidor. Si las filas son iguales a cero, entonces el jugador no tiene datos en la base de datos todavнa lo que significa que aъn no se ha registrado. Por lo tanto, se mostrarб el cuadro de diбlogo para registrarse.

Por ъltimo, pero no menos importante, tenemos que configurar nuestros diбlogos. Esto lo hacemos con la devoluciуn de llamada OnDialogResponse.

PHP код:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid)
    {
        case 
LoginDialog:
        {
            if(!
responseKick(playerid);
            
            new
                
hashpass[129],
                
query[100],
                
playername[MAX_PLAYER_NAME];
            
GetPlayerName(playeridplayernamesizeof(playername));
            
WP_Hash(hashpasssizeof(hashpass), inputtext);
            if(!
strcmp(hashpassPlayer[playerid][Password]))
            {
                
mysql_format(mysqlquerysizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%e' LIMIT 1"playername);
                
mysql_tquery(mysqlquery"OnAccountLoad""i"playerid);
            }
            else
            {
                
SendClientMessage(playerid, -1"Introduciste una contraseсa incorrecta!");
                
ShowPlayerDialog(playeridLoginDialogDIALOG_STYLE_INPUT"Login""Bienvenido!\nTu cuenta estб registrada en nuestra base de datos. Por favor, ingresa tu contraeсa:""Login""Salir");
            }
        }
        case 
RegisterDialog:
        {
            if(!
response) return Kick(playerid);
            if(
strlen(inputtext) < 5)
            {
                
SendClientMessage(playerid, -1"Tu contraseсa debe contener mбs de 4 carбcteres.");
                return 
ShowPlayerDialog(playeridRegisterDialogDIALOG_STYLE_INPUT"Registro""Bienvenido!\nTu cuenta no estб registrada en nuestro servidor. Ingresa la contraseсa que deseas usar:""Registrarse""Salir");
            }
            new
                
query[512],
                
playername[MAX_PLAYER_NAME],
                
playerip[16];
                
            
GetPlayerName(playeridplayernamesizeof(playername));
            
GetPlayerIp(playeridplayeripsizeof(playerip));
            
WP_Hash(Player[playerid][Password], 129inputtext);
            
mysql_format(mysqlquerysizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `Admin`, `VIP`, `Money`, `PosX`, `PosY`, `PosZ`, `PosA`) VALUES ('%e', '%e', '%e', 0, 0, 0, 0.0, 0.0, 0.0, 0.0)"playernamePlayer[playerid][Password], playerip);
            
mysql_tquery(mysqlquery"OnAccountRegister""i"playerid);
        }
    }
    return 
false// Para filterscripts..

Revisamos el dialogo que el usuario estб viendo, lo hacemos mediante el uso de un switch. Estoy 99.9999% seguro de que usaste switches alguna vez anteriormente asн que no lo voy a explicar, hay muchos tutoriales que se centran en eso ЎЎ******a!! Una vez encontramos el case correcto, en el primer ejemplo el dialogo del login, ejecutamos el cуdigo que se encuentra en este case.

El dialogo del login: Expulsamos al jugador cuando selecciona la opciуn 'Salir'. Despuйs declaramos las tres variables que vamos a usar: hashpasss (para encriptar el inputtext), query (la variable que almacena la sentencia MySQL) y playername (para almacenar el nombre del jugador). Nos centraremos en dos variables; playername y hashpass. Para comprobar si el jugador ha introducido una contraseсa, primero tenemos que encriptar el texto introducido ya que la contraseсa se almacena de forma encriptada en nuestra base de datos. Para comparar el texto introducido y la contraseсa almacenada del jugador, usamos la funciуn 'strcmp' - el signo de exlamaciуn antes de strcmp se representa como el clбsico '== 0' en el final de una funciуn comъn. Esto es debido a que la funciуn strcmp retorna 0 cuando las dos cadenas que estamos comparando coinciden. Si el texto introducido al ser encriptado y la contraseсa almacenada en la tabla coinciden, se cargan los datos faltantes del jugador. Pero si el texto introducido al ser encriptado no coincide con la contraseсa, se envнa un mensaje diciendo que es incorrecta y se muestra el dialogo nuevamente para tratar de ingresar nuevamente. Es recomendable que agregues un contador de intentos para que intenten adivinar las contraseсas de otros jugadores.

El dialogo del registro: Al igual que con el dialogo del login, expulsamos al jugador cuando selecciona la opciуn 'Salir'. Luego comprobamos que el texto introducido es mayor a 5 carбcteres de longitud. Si es menor a 5 carбcteres, se le dirб al jugador que su contraseсa debe contener mбs de 4 carбcteres y se mostrarб de nuevo el dialogo para que introduzca una contraseсa. Despъes de hacer esto, declaramos las variables: hashpasss (para encriptar el inputtext), query (la variable que almacena la sentencia MySQL), playername (para almacenar el nombre del jugador) y playerip (para almacenar la IP). Nos centraremos en dos variables; playername y playerip. Hemos almacenado el texto encriptado en la variable Player[playerid][Password]. Finalmente, creamos la cuenta del jugador y almacenamos sus datos en la tabla 'accounts'.

PHP код:
forward OnAccountLoad(playerid);
public 
OnAccountLoad(playerid)
{
    
Player[playerid][Admin] = cache_get_field_content_int(0"Admin");
    
Player[playerid][VIP] = cache_get_field_content_int(0"VIP");
    
Player[playerid][Money] = cache_get_field_content_int(0"Money");
    
Player[playerid][posX] = cache_get_field_content_float(0"PosX");
    
Player[playerid][posY] = cache_get_field_content_float(0"PosY");
    
Player[playerid][posZ] = cache_get_field_content_float(0"PosZ");
    
Player[playerid][posA] = cache_get_field_content_float(0"PosA");
     
    
GivePlayerMoney(playeridPlayer[playerid][Money]);
    
SendClientMessage(playerid, -1"Logueaste correctamente, bienvenido.");
    return 
true;

Esto es lo que se ejecuta cuando realizamos la consulta en el dialogo de login. Como mencionй anteriormente, tenemos que cargar el resto de datos del jugador cuando ingresу correctamente su contraseсa. Podemos hacer esto facilmente usando una consulta enlazada en el dialogo de registro. Nota: Consultas enlazadas estбn siempre en la forma de callbacks (public) entonces debemos usar forward antes!

Simplemente asignamos las variables del jugador al valor de lo que se tomу de la base de datos. Para tomar el valor de la base de datos se utiliza una funciуn llamada 'cache_get_field_content_'. Puesto que tenemos diferentes tipos de valor, tambiйn hay que incluir el tipo de valor que estamos tratando de recuperar:
  • Para datos en forma de enteros (INT) usamos: cache_get_field_content_int
  • Para datos en forma de texto (VARCHAR) usamos: cache_get_field_content
  • Para datos en forma de decimales (FLOAT) usamos: cache_get_field_content_float
El enum 'Admin' es un entero, entonces debemos usar 'cache_get_field_content_int'.
Podemos ver que el nъmero '0' es el primer parбmetro de la funciуn, este 0 es la ID de la fila en nuestra base de datos. Cuando cargamos la cantidad de filas para el jugador que se conecta, las limitamos solo a 1 fila. Tal como con los arrays, empecamos contando desde 0, NO DESDE 1. El nъmero 0 en este caso corresponde a la primera fila que obtuvimos previamente. El segundo parametro es el nombre de la columna representado en un string. Finalizamos la callback seteando el dinero del jugador y enviando un mensaje de que ingresу correctamente.

PHP код:
forward OnAccountRegister(playerid);
public 
OnAccountRegister(playerid)
{
    
Player[playerid][ID] = cache_insert_id();
    
printf("[Registro] Se ha creado una nueva cuenta, ID de la base de datos: [%d]"Player[playerid][ID]);
    return 
true;

Esta es la consulta que ejecutamos en el dialogo de registro. Tal como en el dialogo de login, la cuncion que llamamos con la consulta enlazada debe ser SIEMPRE en forma de public, por lo tanto debe tener forward, recuйrdalo! Lo que hacemos aquн es asignar la 'ID' del jugador (La ID de la cuenta, no de la conexiуn (TAB)) a la que la base de datos le ha asignado.

PHP код:
public OnPlayerSpawn(playerid)
{
    
SetPlayerPos(playeridPlayer[playerid][posX], Player[playerid][posY], Player[playerid][posZ]);
    
SetPlayerFacingAngle(playeridPlayer[playerid][posA]);
    
    return 
true;

Para finalizar el proceso de login o de registro, establecemos la posiciуn y el angulo del jugador en el mundo.

PHP код:
public OnPlayerDisconnect(playeridreason)
{
    new
        
query[128],
        
Float:pos[4];
        
    
GetPlayerPos(playeridpos[0], pos[1], pos[2]);
    
GetPlayerFacingAngle(playeridpos[3]);
    
    
mysql_format(mysqlquerysizeof(query), "UPDATE `accounts` SET `Money` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosA` = %f WHERE `ID` = %d",
    
GetPlayerMoney(playerid), pos[0], pos[1], pos[2], pos[3], Player[playerid][ID]);
    
mysql_tquery(mysqlquery"""");
    
    return 
true;

Obviamente, tenemos que guardar los datos del jugador en el momento que se desconecta para que cuando vuelva a conectarse tenga todo justo como lo dejу al salir. Esto lo hacemos en la callback 'OnPlayerDisConnect' la cual es llamada cuando el jugador se desconecta, obviamente. Comenzamos declarando las variables que vamos a utilizar; query (para la consulta MySQL) y Float: pos[] (para las coordenadas del jugador). El prefijo 'Float:' es para poder utilizar decimales y obtener la coordenada exacta. Seguimos con el proceso de guardado de datos colocandole el valor a nuestras variables. Para las coordenadas X, Y, Z usaremos la funciуn 'GetPlayerPos'. Podemos ver que el angulo del jugador (A) no estб aqui. Para este campo debemos usar la funciуn 'GetPlayerFacingAngle'. Terminamos el guardado de datos actualizando la base de datos con la nueva informaciуn del jugador. Desde que el jugador se desconecta, es innecesario usar una consulta enlazada.

Epнlogo
Me gustarнa recordar, a quien haya llegado hasta esta parte del tutorial, que si, cree gran parte de este tutorial basandome en el tutorial de newbienoob's y esto es exactamente una actualizaciуn de su tutorial.
Errores gramaticales y de script hбganmelo saber, aceptarй las criticas. Aсadirй una secciуn de preguntas frecuentes cuando se empiecen a generar preguntas.

Esto no ha sido testeado todavнa. Me gustarнa testear esto en un futuro cercano pero no he tenido mucho tiempo, pero creo que con la explicaciуn debe funcionar todo correctamente.

Gracias.

Nota de la traducciуn: No he traducido las funciones del script, ya que asн creo que las pueden entender mejor y evitan el Spanglish en su Gm
Si el tutorial es actualizado, actualizarй este tema tambiйn.
El creador del tutorial me ha dado permiso para realizar esta traducciуn.


Creditos:
Newbienoob por la primera versiуn de este tutorial. Tutorial de newbienoob.
Overhaul por la actualizaciуn del antiguo tutorial + explicaciуn extra. Tutorial original en inglйs.
Infernux, por la traducciуn de este tutorial.
Reply
#2

Hola, buen tutorial, me funcionу entre comillas pero creo que el error es por mi.

Me gustarнa tener un punto de spawn para el registro y ya luego en el prуximo login pues aparecer en la ъltima posiciуn.

Lo que hice fue entrar el phpmyadmin e ir a las cuatro posiciones y agregar en 'PREDETERMINADO' la opciуn 'Personalizado:' y agreguй ahн unas coordenadas.

Despuйs lo que hice fue agregar la funciуn SpawnPlayer(playerid); que se supone que llama a OnPlayerSpawn que este a su vez contiene las coordenadas de la base de datos. Ya en el servidor al registrarme no aparece en las coordenadas que yo puse si no bugueado, caes y apareces en la granja.

Espero que pueda solucionarlo, gracias.
Reply
#3

@up

Usando el insert de esta manera no colocaria 0.0 a las coordenadas del nuevo usuario insertado en la base datos, por lo que podrias usar la posicion definida en tu phpmyadmin.

PHP код:
 mysql_format(mysqlquerysizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `Admin`, `VIP`, `Money`) VALUES ('%e', '%e', '%e', 0, 0, 0)"playernamePlayer[playerid][Password], playerip); 
Reply
#4

Quote:
Originally Posted by N3cromancer
Посмотреть сообщение
@up

Usando el insert de esta manera no colocaria 0.0 a las coordenadas del nuevo usuario insertado en la base datos, por lo que podrias usar la posicion definida en tu phpmyadmin.

PHP код:
 mysql_format(mysqlquerysizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `Admin`, `VIP`, `Money`) VALUES ('%e', '%e', '%e', 0, 0, 0)"playernamePlayer[playerid][Password], playerip); 
Vaya, cierto... jaja muchas gracias.

Prбcticamente podнa ver hasta el "INSERT INTO..." y no me fijй que estaba ahн las coordenadas tambiйn.

Gracias nuevamente.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)