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