How do I create a database for my gm
#1

Hi, I downloaded the samp server from scratch to start making an RP this https://www.sa-mp.com/download.php on your page and I downloaded the mysql install the mysql R41-4 now I want to know how I do my database to upload it to the localhost of my xampp

GM / FS: - https://www.sa-mp.com/download.php the SA-MP 0.3.7-R2 Windows Server
Notes: - + 1
this is all my gm
Quote:

#include <a_samp>
#include <core>
#include <a_mysql>
#include <float>

main()
{
print("---------- ---------- ---------- ---------- ---------- ----------\n");
print(" *- La lista del servidor XXXXX ha sido cargada, creado por xxx\n");
print("---------- ---------- ---------- ---------- ---------- ----------\n");
}

#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE "database"

/* Define */
#define SEGUNDOS_PARA_INICIARSESIУN 30

/* Donde aparece cuando te registras */
#define DEFAULT_POS_X 1958.3783
#define DEFAULT_POS_Y 1343.1572
#define DEFAULT_POS_Z 15.3746
#define DEFAULT_POS_A 270.1425

/* La conexiуn MySQL */
new MySQL: g_SQL;

/* Datos del jugador */
enum jInfo
{
ID,
Name[MAX_PLAYER_NAME],
Password[65], // la salida de la funciуn SHA256_PassHash (que se agregу en la versiуn 0.3.7 R1) siempre tiene 256 bytes de longitud, o el equivalente de 64 celdas de peуn
Salt[17],
Kills,
Deaths,
Float: X_Pos,
Float: Y_Pos,
Float: Z_Pos,
Float: A_Pos,
Interior,

Cache: Cache_ID,
bool: IsLoggedIn,
LoginAttempts,
LoginTimer
};
new Jugador[MAX_PLAYERS][jInfo];

new g_MysqlRaceCheck[MAX_PLAYERS];

/* Datos de diбlogo */
enum
{
DIALOG_UNUSED,

DIALOG_LOGIN,
DIALOG_REGISTER
};

public OnGameModeInit()
{
new MySQLOpt: option_id = mysql_init_options();

mysql_set_option(option_id, AUTO_RECONNECT, true); // se vuelve a conectar automбticamente al perder la conexiуn al servidor mysql

g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); // AUTO_RECONNECT estб habilitado solo para este mango de conexiуn
if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
{
print("La conexiуn de MySQL fallу. El servidor se estб apagando.");
SendRconCommand("salir"); // cierra el servidor si no hay conexiуn
return 1;
}

print("La conexiуn de MySQL es exitosa.");
return 1;
}

public OnGameModeExit()
{
// guardar todos los datos del jugador antes de cerrar la conexiуn
for (new i = 0, j = GetPlayerPoolSize(); i <= j; i++) // Se agregу la funciуn GetPlayerPoolSize en la versiуn 0.3.7 y obtiene el playerid mбs alto actualmente en uso en el servidor
{
if (IsPlayerConnected(i))
{
// razуn se establece en 1 para 'Salir' normal
OnPlayerDisconnect(i, 1);
}
}

mysql_close(g_SQL);
return 1;
}

public OnPlayerConnect(playerid)
{
g_MysqlRaceCheck[playerid]++;

// restablecer los datos del jugador
static const empty_player[jInfo];
Jugador[playerid] = empty_player;

GetPlayerName(playerid, Jugador[playerid][Name], MAX_PLAYER_NAME);

// enviar una consulta para recibir todos los datos almacenados del jugador de la tabla
new query[103];
mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", Jugador[playerid][Name]);
mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
g_MysqlRaceCheck[playerid]++;

UpdatePlayerData(playerid, reason);

// si el jugador fue expulsado (contraseсa incorrecta o tardando demasiado) durante la parte de inicio de sesiуn, elimine los datos de la memoria
if (cache_is_valid(Jugador[playerid][Cache_ID]))
{
cache_delete(Jugador[playerid][Cache_ID]);
Jugador[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
}

// si el jugador fue pateado antes de que el tiempo expire (30 segundos), mata el temporizador
if (Jugador[playerid][LoginTimer])
{
KillTimer(Jugador[playerid][LoginTimer]);
Jugador[playerid][LoginTimer] = 0;
}

// establece "IsLoggedIn" en falso cuando el reproductor se desconecta, evita guardar los datos del reproductor dos veces cuando se usa "gmx"
Jugador[playerid][IsLoggedIn] = false;
return 1;
}

public OnPlayerSpawn(playerid)
{
// generar el jugador en su ъltima posiciуn guardada
SetPlayerInterior(playerid, Jugador[playerid][Interior]);
SetPlayerPos(playerid, Jugador[playerid][X_Pos], Jugador[playerid][Y_Pos], Jugador[playerid][Z_Pos]);
SetPlayerFacingAngle(playerid, Jugador[playerid][A_Pos]);

SetCameraBehindPlayer(playerid);
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
UpdatePlayerDeaths(playerid);
UpdatePlayerKills(killerid);
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch (dialogid)
{
case DIALOG_UNUSED: return 1; // Ъtil para diбlogos que contienen solo informaciуn y no hacemos nada dependiendo de si respondieron o no

case DIALOG_LOGIN:
{
if (!response) return Kick(playerid);

new hashed_pass[65];
SHA256_PassHash(inputtext, Jugador[playerid][Salt], hashed_pass, 65);

if (strcmp(hashed_pass, Jugador[playerid][Password]) == 0)
{

// contraseсa correcta, genera el jugador
ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have been successfully logged in.", "Okay", "");

// establece el cachй especificado como el cachй activo para que podamos recuperar el resto de los datos del jugador
cache_set_active(Jugador[playerid][Cache_ID]);

AssignPlayerData(playerid);

// elimina la memoria cachй activa de la memoria y tambiйn desactiva la memoria cachй activa
cache_delete(Jugador[playerid][Cache_ID]);
Jugador[playerid][Cache_ID] = MYSQL_INVALID_CACHE;

KillTimer(Jugador[playerid][LoginTimer]);
Jugador[playerid][LoginTimer] = 0;
Jugador[playerid][IsLoggedIn] = true;

// generar el jugador en su ъltima posiciуn guardada despuйs de iniciar sesiуn
SetSpawnInfo(playerid, NO_TEAM, 0, Jugador[playerid][X_Pos], Jugador[playerid][Y_Pos], Jugador[playerid][Z_Pos], Jugador[playerid][A_Pos], 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
else
{
Jugador[playerid][LoginAttempts]++;

if (Jugador[playerid][LoginAttempts] >= 3)
{
ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have mistyped your password too often (3 times).", "Okay", "");
DelayedKick(playerid);
}
else ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Wrong password!\nPlease enter your password in the field below:", "Login", "Abort");
}
}
case DIALOG_REGISTER:
{
if (!response) return Kick(playerid);

if (strlen(inputtext) <= 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Your password must be longer than 5 characters!\nPlease enter your password in the field below:", "Register", "Abort");

// 16 caracteres aleatorios de 33 a 126 (en ASCII) para la sal
for (new i = 0; i < 16; i++) Jugador[playerid][Salt][i] = random(94) + 33;
SHA256_PassHash(inputtext, Jugador[playerid][Salt], Jugador[playerid][Password], 65);

new query[221];
mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`username`, `password`, `salt`) VALUES ('%e', '%s', '%e')", Jugador[playerid][Name], Jugador[playerid][Password], Jugador[playerid][Salt]);
mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
}

default: return 0; // ID de diбlogo no se encontrу, busca en otras secuencias de comandos
}
return 1;
}

//-----------------------------------------------------

forward OnPlayerDataLoaded(playerid, race_check);
public OnPlayerDataLoaded(playerid, race_check)
{
/* verificaciуn de condiciуn de carrera:
el jugador A se conecta -> se activa la consulta SELECT -> esta consulta lleva mucho tiempo
mientras la consulta aъn se estб procesando, el jugador A con el playerid 2 se desconecta
el jugador B se une ahora con playerid 2 -> nuestra consulta laggy SELECT finalmente ha terminado, pero para el jugador equivocado

їQuй hacemos contra eso?
creamos un conteo de conexiones para cada jugador y lo aumentamos cada vez que el playerid se conecta o desconecta
tambiйn pasamos el valor actual del recuento de conexiones a nuestra devoluciуn de llamada OnPlayerDataLoaded
luego verificamos si el recuento de la conexiуn actual es el mismo que el conteo de la conexiуn que pasamos a la devoluciуn de llamada
si es asн, todo estб bien, si no, simplemente pateamos al jugador
*/
if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);

new string[115];
if(cache_num_rows() > 0)
{
// almacenamos la contraseсa y la sal para poder comparar la contraseсa de las entradas del jugador
// y guarda el resto para no tener que ejecutar otra consulta mбs tarde
cache_get_value(0, "password", Jugador[playerid][Password], 65);
cache_get_value(0, "salt", Jugador[playerid][Salt], 17);

// guarda el cachй activo en la memoria y devuelve un identificador de cachй para acceder a йl para usarlo mбs tarde
Jugador[playerid][Cache_ID] = cache_save();

format(string, sizeof string, "This account (%s) is registered. Please login by entering your password in the field below:", Jugador[playerid][Name]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", string, "Login", "Abort");

// a partir de ahora, el jugador tiene 30 segundos para iniciar sesiуn
Jugador[playerid][LoginTimer] = SetTimerEx("OnLoginTimeout", SEGUNDOS_PARA_INICIARSESIУN * 1000, false, "d", playerid);
}
else
{
format(string, sizeof string, "Welcome %s, you can register by entering your password in the field below:", Jugador[playerid][Name]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", string, "Register", "Abort");
}
return 1;
}

forward OnLoginTimeout(playerid);
public OnLoginTimeout(playerid)
{
// restablecer la variable que almacena el timerid
Jugador[playerid][LoginTimer] = 0;

ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have been kicked for taking too long to login successfully to your account.", "Okay", "");
DelayedKick(playerid);
return 1;
}

forward OnPlayerRegister(playerid);
public OnPlayerRegister(playerid)
{
// recupera la ID generada para una columna AUTO_INCREMENT por la consulta enviada
Jugador[playerid][ID] = cache_insert_id();

ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Registration", "Account successfully registered, you have been automatically logged in.", "Okay", "");

Jugador[playerid][IsLoggedIn] = true;

Jugador[playerid][X_Pos] = DEFAULT_POS_X;
Jugador[playerid][Y_Pos] = DEFAULT_POS_Y;
Jugador[playerid][Z_Pos] = DEFAULT_POS_Z;
Jugador[playerid][A_Pos] = DEFAULT_POS_A;

SetSpawnInfo(playerid, NO_TEAM, 0, Jugador[playerid][X_Pos], Jugador[playerid][Y_Pos], Jugador[playerid][Z_Pos], Jugador[playerid][A_Pos], 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
return 1;
}

forward _KickPlayerDelayed(playerid);
public _KickPlayerDelayed(playerid)
{
Kick(playerid);
return 1;
}


//-----------------------------------------------------

AssignPlayerData(playerid)
{
cache_get_value_int(0, "id", Jugador[playerid][ID]);

cache_get_value_int(0, "kills", Jugador[playerid][Kills]);
cache_get_value_int(0, "deaths", Jugador[playerid][Deaths]);

cache_get_value_float(0, "x", Jugador[playerid][X_Pos]);
cache_get_value_float(0, "y", Jugador[playerid][Y_Pos]);
cache_get_value_float(0, "z", Jugador[playerid][Z_Pos]);
cache_get_value_float(0, "angle", Jugador[playerid][A_Pos]);
cache_get_value_int(0, "interior", Jugador[playerid][Interior]);
return 1;
}

DelayedKick(playerid, time = 500)
{
SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid);
return 1;
}

SetupPlayerTable()
{
mysql_tquery(g_SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(24) NOT NULL,`password` char(64) NOT NULL,`salt` char(16) NOT NULL,`kills` mediumint( NOT NULL DEFAULT '0',`deaths` mediumint( NOT NULL DEFAULT '0',`x` float NOT NULL DEFAULT '0',`y` float NOT NULL DEFAULT '0',`z` float NOT NULL DEFAULT '0',`angle` float NOT NULL DEFAULT '0',`interior` tinyint(3) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`))");
return 1;
}

UpdatePlayerData(playerid, reason)
{
if (Jugador[playerid][IsLoggedIn] == false) return 0;

// si el cliente se bloqueу, no es posible obtener la posiciуn del jugador en OnPlayerDisconnect callback
// entonces usaremos la ъltima posiciуn guardada (en el caso de un jugador que se registrу y se estrellу / pateу, la posiciуn serб el punto de generaciуn predeterminado)
if (reason == 1)
{
GetPlayerPos(playerid, Jugador[playerid][X_Pos], Jugador[playerid][Y_Pos], Jugador[playerid][Z_Pos]);
GetPlayerFacingAngle(playerid, Jugador[playerid][A_Pos]);
}

new query[145];
mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `x` = %f, `y` = %f, `z` = %f, `angle` = %f, `interior` = %d WHERE `id` = %d LIMIT 1", Jugador[playerid][X_Pos], Jugador[playerid][Y_Pos], Jugador[playerid][Z_Pos], Jugador[playerid][A_Pos], GetPlayerInterior(playerid), Jugador[playerid][ID]);
mysql_tquery(g_SQL, query);
return 1;
}

UpdatePlayerDeaths(playerid)
{
if (Jugador[playerid][IsLoggedIn] == false) return 0;

Jugador[playerid][Deaths]++;

new query[70];
mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `deaths` = %d WHERE `id` = %d LIMIT 1", Jugador[playerid][Deaths], Jugador[playerid][ID]);
mysql_tquery(g_SQL, query);
return 1;
}

UpdatePlayerKills(killerid)
{
// debemos verificar antes si el asesino no era un jugador vбlido (conectado) para evitar el error de tiempo de ejecuciуn 4
if (killerid == INVALID_PLAYER_ID) return 0;
if (Jugador[killerid][IsLoggedIn] == false) return 0;

Jugador[killerid][Kills]++;

new query[70];
mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d WHERE `id` = %d LIMIT 1", Jugador[killerid][Kills], Jugador[killerid][ID]);
mysql_tquery(g_SQL, query);
return 1;
}

Reply


Messages In This Thread
How do I create a database for my gm - by GOM3Z - 30.12.2017, 17:17
Re: How do I create a database for my gm - by Ritzy2K - 30.12.2017, 17:42
Re: How do I create a database for my gm - by GOM3Z - 30.12.2017, 17:46

Forum Jump:


Users browsing this thread: 1 Guest(s)