SA-MP Forums Archive
help As an arrangement this of the MYSQL R41-4 - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: help As an arrangement this of the MYSQL R41-4 (/showthread.php?tid=647145)



help As an arrangement this of the MYSQL R41-4 - GOM3Z - 30.12.2017

Detailed explanation of the order: -Good 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 the last of all and I've been putting the Source code (zip) of this page https://github.com/pBlueG/SA-MP-MySQL/releases for the registration and all the mysql complete and I get this warning as I fix ?, it turns out that that line does not exist in my gamemode then I went where it says "SetupPlayerTable"
[centrar]el warning[/centrar]
[pawn=]
Quote:

C:\Users\hp\Desktop\Nueva carpeta\gamemodes\bare.pwn(379) : warning 203: symbol is never used: "SetupPlayerTable"
Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


1 Warning.

[/pawn]
[centrar]el SetupPlayerTable[/centrar]
[pawn=]
Quote:

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

[/pawn]

[centrar]All the gm script[/centrar]
[pawn=]
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;
}

[/pawn]
GM/FS: - https://www.sa-mp.com/download.php la de SA-MP 0.3.7-R2 Windows Server


Re: help As an arrangement this of the MYSQL R41-4 - Ritzy2K - 30.12.2017

It's a warning, if your function isn't getting used then just remove it, or if you want to use it in future uses and don't want that warning then just add the stock keyword in front of your function.


Re: help As an arrangement this of the MYSQL R41-4 - GOM3Z - 30.12.2017

I want to use it as I do the stock?


Re: help As an arrangement this of the MYSQL R41-4 - Ritzy2K - 30.12.2017

If you want it in future, then use, put stock keyword for now, but when you use it, then remove it, since it isn't necessary.


Re: help As an arrangement this of the MYSQL R41-4 - GOM3Z - 30.12.2017

Tanhks