Hola, como les va ? Bueno, estuve un rato sin internet y me puse a hacer este "tutorial" we, de como cargar e insertar datos en una tabla. Tambien contiene un poco de informacion sobre variables, arrays, etc.
Lo hice mas que nada para que me corrijan en que cosas me confundi al explicar, y asi aprender mas :3
Que hace este plugin ademas de ser un tutorial ?
Lo que hace es, guardar en la base de datos, los datos de un hud a mostrar.
El mensaje se le va a mandar cada X tiempo a cada jugador
Podes conectar todos los servidores a la misma base de datos, y mandar el mismo mensaje a todos los servidores.
Lo hice mas que nada para que me corrijan en que cosas me confundi al explicar, y asi aprender mas :3
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
// Vamos a definir cuales son nuestros datos para conectarnos
new MYSQL_HOST[] = "localhost" // Host donde esta alojada la base de datos, en mi caso en localhost (Local = mipc)
new MYSQL_USER[] = "root" // Usuario de la base de datos
new MYSQL_PASS[] = "" // Contraseña (?)
new MYSQL_DB[] = "alliedmodders" // Esta va a ser la base de datos en donde se va a crear la tabla "mensajitos"
new MYSQL_TABLE[] = "mensajitos_mysql" // tabla en donde se van a guardar los datos
new gHud // Seria como el ID de la sincronizacion del hud. Si queremos mostrar 2 huds diferentes, con este identificador, solo se mostrara 1
new Handle:g_SqlTuple // mysql connection, el identificador de la conexion
/*Variable global booleana
Es decir, que esta variable va a tener los siguientes valores
g_type = 0 o g_type = 1
g_type = false o g_type = true
Esta variable global la vamos a usar para chequear si vamos a mandar un mensaje
via chat o hud
g_type = 0 | Mensajes en say
g_type = 1 | Mensajes en hud
ej:
if(g_type)
Verdadero = 1
else
Falso = 0
*/
new g_type
/*Esta variable global, va a setearle un efecto al hud*
Puede ser del 0 al 2 (si no me equivoco, no me acuerdo)
0 = normal
1 = Parpadeo / titileo
2 = Aparecen las letras de izquierda a derecha, letra por letra
*/
new g_effect
/*
String de 250 celdas que vamos a usar para guardar nuestro mensaje
*/
new g_msj[250]
/*Variable global con un array
g_hud_pos[x] = X equilave al numero de grupos del array
En nuestro caso, tenemos 2 grupos
new Float:g_hud_pos[2];
Ahora vamos a asignarle un numero de grupo a cada varariable
g_hud_pos[0] = posicion X del hud, en numero flotante/float (Ej 0.4) - (Para mover el hud, izquierda-derecha)
g_hud_pos[1] = Posicion Y del hud, en numero flotante/float (Ej 0.8) - (Para mover el hud, arriba-abajo)
Como vieron, empieza desde el 0 para adelante
Siempre es el numero de variables que queremos usar, +1
Como usar:
new g_array[5]
g_array[0]
g_array[1]
g_array[2]
g_array[3]
g_array[4]
Como no usar:
new g_array[5] // Yo aca por ejemplo, tengo 4 grupos, +1
g_array[0]
g_array[1]
g_array[2]
g_array[3]
g_array[4]
g_array[5] // Limite excedido
Error: Array index out of bounds (variable "g_array")
*/
new Float:g_hud_pos[2];
/*
Variable global flotante, la vamos a usar
para definir cuanto tiempo va a estar el hud en pantall
*/
new Float:g_hud_time
/*
Variable global flotante, la vamos a usar para definir
cada cuanto tiempo le va a salir el mensaje al jugador
*/
new Float:g_nextmsj;
/*
Lo explique un poco mas arriba
g_color[0] = red
g_color[1] = green
g_color[2] = blue
Para darle colorcito al hud :$
*/
new g_color[3]
new buffer[550] // String de 550 celdas, lo vamos a usar para cargar nuestro mensaje, y mostrarlo en el hud/chat
/*
No se como explicarlo muy bien
Seria el identificador del set_task
set_task(g_nextmsj, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
set_task(Segundos para llamar a la funcion, "funcion_a_llamar", id-player+IDENTIFICADOR-DEL-TASK, const parameter[]="", len = 0, "flag")
*/
const TASK_SHOWHUD = 9325; // El numero no es siempre el mismo
#define ID_SHOWHUD ( taskid - TASK_SHOWHUD )
public plugin_init() {
register_plugin( "Mensajes SQL", "2.0", "SpaM" ) // Ea (? Registramos el plugin e.e
/*
Registramos este evento para que, al empezar la ronda, haga una conexion con la base de datos,
y cargar los datos que hay insertados en la tabla, para actualizar los datos del hud.
*/
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
/*El CreateHudSyncObj() se usa para crear el hud/sincronizarlo, y luego mostrarlo con ShowSyncHudMsg
Ejemplo
ShowSyncHudMsg(id, gHud, "Dewe is gay")
*/
gHud = CreateHudSyncObj()
MYSQL_Init() // Conectamos a la base de datos
}
public event_round_start()
{
MYSQL_Init() // Empieza la ronda, cargamos/actualizamos datos. Si la base de datos esta creada, pero no la tabla, la misma se crea sola.
}
public MYSQL_Init()
{
new g_Error[512], g_query[843], g_motd[1524], len; len = 0 // Celdas - longitudes
/* Conectamos a la base de datos
SQL_MakeDbTuple("IP", "Usuario", "Contraseña", "Base de datos" )
*/
g_SqlTuple = SQL_MakeDbTuple(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB )
// Chequeamos si estamos conectados a la base de datos
if (!g_SqlTuple) // En este caso, si g_SqlTuple, devuelve false (falso)
{
// Mandamos un logs para avisar de que fracaso la conexion
log_to_file("MYSQL_ERROR.txt", "No se pudo conectar con la base de datos.")
// Pausamos el plugin
return pause("a");
}
new ErrorCode, Handle:SqlConnection = SQL_Connect(g_SqlTuple, ErrorCode, g_Error, charsmax(g_Error)) // Estamos conectados a la base de datos
/*
Si no existe la tabla, se la creamos, y le definimos los datos
*/
/*
Vamos a usar INT para guardar/cargar numeros
INT:
Un entero de 4 bytes; el rango con signo es de
2147483648 a 2147483647
El rango sin signo es de
0 a 4294967295
Vamos a usar VARCHAR para guardar/cargar
letras/numeros:
VARCHAR:
Cadena de longitud variable (0-65, 535), la longitud
maxima esta asociada al tamaño maximo de un registro
Vamos a usar FLOAT para guardar numeros flotantes (floats)
FLOAT:
Un número de coma flotante pequeño, los valores posibles
son de -3.402823466E+38 a -1.175494351E-38
y de 1.175494351E-38 a 3.402823466R+28
*/
len += formatex(g_motd[len], charsmax(g_motd) - len, "CREATE TABLE IF NOT EXISTS `%s`(", MYSQL_TABLE)
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Type` int(1) NOT NULL DEFAULT '1', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Msj` varchar(150) NOT NULL, ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Pos X` float NOT NULL DEFAULT '0.4', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Pos Y` float NOT NULL DEFAULT '0.8', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Tit` int(1) NOT NULL DEFAULT '1', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Time` float NOT NULL DEFAULT '15.0', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Red` int(3) NOT NULL DEFAULT '0', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Green` int(3) NOT NULL DEFAULT '240', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Blue` int(3) NOT NULL DEFAULT '100', ")
len += formatex(g_motd[len], charsmax(g_motd) - len, "`Nextspam` float NOT NULL DEFAULT '15.0')")
/*
Vamos a ejecutar la query/consulta para crear las tablas
*/
SQL_ThreadQuery(g_SqlTuple, "QueryCreateTable", g_motd)
// Si estamos conectados a la base de datos
if (SqlConnection != Empty_Handle)
{
/*Preparamos la consulta, y seleccionamos los datos a cargar
SELECT * FROM, se usa para seleccionar TODOS los datos que esten guardados en la tabla seleccionada
*/
new Handle:query = SQL_PrepareQuery(SqlConnection, "SELECT * FROM `%s`", MYSQL_TABLE)
/* Ejecutamos la consulta
Y cargamos datos
*/
SQL_Execute(query)
if (SQL_NumResults(query))
{
/*
Una vez la consulta/query ejecutada y en proceso
Seleccionamos los datos (Casi siempre empieza desde el 0 en adelante)
y le asignamos el valor obtenido de la columna, a la variable
*/
g_type = SQL_ReadResult(query, 0) // Leemos y cargamos la columna n0 (Type), y le seteamos el valor a g_type
SQL_ReadResult(query, 1, buffer, charsmax(buffer)) // Leemos y cargamos la columna n1 (Msj), y le seteamos el valor/string a buffer (aca guardaremos nuestro mensaje)
/*Cuando creamos el array, pusimos para que sea un array flotante.
En este caso, para leer los valores (flotantes) de las columnas "Pos X" y "Pos Y"
tenemos que poner que el array es flotante, y hacerlo de esta forma
*/
SQL_ReadResult(query, 2, Float:g_hud_pos[0])// Leemos y cargamos la columna n2 (Pos X), y le seteamos el valor a g_hud_pos[0]
SQL_ReadResult(query, 3, Float:g_hud_pos[1])// Leemos y cargamos la columna n3 (Pos Y), y le seteamos el valor a g_hud_pos[1]
g_effect = SQL_ReadResult(query, 4) // Leemos y cargamos la columna n4 (Tit), y le seteamos el valor a g_effect
SQL_ReadResult(query, 5, Float:g_hud_time) // Leemos y cargamos la columna n5 (Time), y le seteamos el valor flotante a g_hud_time
g_color[0] = SQL_ReadResult(query, 6) // Leemos y cargamos la columna n6 (Red), y le seteamos el valor a g_color[0]
g_color[1] = SQL_ReadResult(query, 7) // Leemos y cargamos la columna n7 (Green), y le seteamos el valor a g_color[1]
g_color[2] = SQL_ReadResult(query, 8) // Leemos y cargamos la columna n8 (Blue), y le seteamos el valor a g_color[2]
SQL_ReadResult(query, 9, Float:g_nextmsj) // Leemos y cargamos la columna n9 (Nextspam), y le seteamos el valor a g_nextmsj
copy(g_msj, charsmax(g_msj[]), buffer) // El mensaje cargado en buffer, va a ser copiado en g_msj (?
}
else
{
// Si no hay datos en la tabla, se los insertamos
formatex(g_query,charsmax(g_query), "INSERT INTO `%s` (`Type`, `Msj`, `Pos X`, `Pos Y`, `Tit`, `Time`, `Red`, `Green`, `Blue`, `Nextspam`) VALUES ('1', 'Open fire gordon, open fire!', '0.4', '0.8', '1', '2.5', '200', '100', '100', '15.0')", MYSQL_TABLE)
SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", g_query) // Cerramos/liberamos la consulta
}
SQL_FreeHandle(query) // Cerramos/liberamos la consulta
}
SQL_FreeHandle(SqlConnection) // Cerramos la conexion
return PLUGIN_CONTINUE;
}
// Chequeamos la consulta
public QueryCreateTable(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
/*Si la query/consulta esta mal
Mandamos un log
*/
switch (FailState) {
case TQUERY_CONNECT_FAILED: log_to_file("SQL_LOG_TQ.txt", "Failed to connect to database [%i]: %s", Errorcode, Error)
case TQUERY_QUERY_FAILED: log_to_file("SQL_LOG_TQ.txt", "Error on query for creating table [%i]: %s", Errorcode, Error)
}
return PLUGIN_HANDLED;
}
public IgnoreHandle(FailState, Handle:Query, Error[], Errcode, Data[], DataSize)
{
SQL_FreeHandle(Query) // Cerramos/liberamos la consulta
return PLUGIN_HANDLED;
}
/*client_putinserver se llama cuando el jugador esta entrando al servidor
Antes de que termine el cartelito de "cargando"
*/
public client_putinserver(id)
{
/* Ya lo explique mas arriba (? Al
Al jugador que se esta conectado, le seteamos el task, que es lo que va a llamar a la funcion
"ShowHUD", dependiendo de cuanto tiempo este definida la variable g_nextmsk
g_nextmsk, tambien es lo que va a definir cada cuanto tiempo le va a salir el mensaje al jugador
*/
set_task(g_nextmsj, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
}
public client_disconnect(id)
{
// Cuando el jugador se desconecta, le removemos el task
remove_task(id+TASK_SHOWHUD)
}
public ShowHUD(taskid) // taskid = identificador del task
{
static id
id = ID_SHOWHUD; // identificador del usuario
if(!g_type) // False = 0
{
// Mensaje solo en el say
client_print(id, print_chat, "%s", buffer)
}
else // True = 1
{
// Le seteamos las propiedades que cargamos, al hud que vamos a mostrar
set_hudmessage(g_color[0], g_color[1], g_color[2], g_hud_pos[0], g_hud_pos[1], g_effect, 5.0, g_hud_time, 1.0, 1.0, -1)
//set_hudmessage(red=200, green=100, blue=0, Float:x=-1.0, Float:y=0.35, effects=0, Float:fxtime=6.0, Float:holdtime=12.0, Float:fadeintime=0.1, Float:fadeouttime=0.2,channel=4);
ShowSyncHudMsg(id, gHud, "%s", buffer) // Le mostramos el hud con el mensaje al jugador
}
}
// Ni ganas de explicar este stock (?
stock color_chat(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4"); // Green Color
replace_all(msg, 190, "!y", "^1"); // Default Color
replace_all(msg, 190, "!team", "^3"); // Team Color
replace_all(msg, 190, "!team2", "^0"); // Team2 Color
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}
Que hace este plugin ademas de ser un tutorial ?
Lo que hace es, guardar en la base de datos, los datos de un hud a mostrar.
El mensaje se le va a mandar cada X tiempo a cada jugador
Podes conectar todos los servidores a la misma base de datos, y mandar el mismo mensaje a todos los servidores.