13/05/2022, 10:21 PM
(Última modificación: 16/04/2023, 09:35 PM por [E]manuelitop15. Edited 4 times in total.)
Hola a todos, dejo este pequeño plugin que hice el año pasado y lo tenia guardado y me di cuenta que en el foro aún no encontré algun top 15 que traiga rank. El top 15 es por MOTD y el rank es por un menú.
Se abre el top al escribir /top15, y el rank /rank.
Espero les sirva...
CVARS
topsql_contar_suicidio "0" - Al suicidarte cuenta como una muerte mas. Por defecto 0.
topsql_ignorar_bots "0" - Ignora que los bots sean registrados en la tabla y por ende sumados al top / rank. Por defecto 0.
![[Imagen: 20220513041557-1.jpg]](https://i.ibb.co/PWLNZhv/20220513041557-1.jpg)
![[Imagen: 20220513041551-1.jpg]](https://i.ibb.co/m6grfLj/20220513041551-1.jpg)
Se abre el top al escribir /top15, y el rank /rank.
Espero les sirva...
CVARS
topsql_contar_suicidio "0" - Al suicidarte cuenta como una muerte mas. Por defecto 0.
topsql_ignorar_bots "0" - Ignora que los bots sean registrados en la tabla y por ende sumados al top / rank. Por defecto 0.
![[Imagen: 20220513041557-1.jpg]](https://i.ibb.co/PWLNZhv/20220513041557-1.jpg)
![[Imagen: 20220513041551-1.jpg]](https://i.ibb.co/m6grfLj/20220513041551-1.jpg)
Código PHP:
// ____________________
//
// TOP 15 MOTD - MYSQL
// ____________________
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <sqlx>
//===========================================
// Para usar MySql solo deja activado esto
// #define MODO_MYSQL
//===========================================
#define JUGADOR_VALIDO(%0) (1 <= %0 <= MAX_PLAYERS)
#define OBTENER_BIT_DEL_JUGADOR(%0,%1) (JUGADOR_VALIDO(%1) && (%0 & (1 << (%1 & 31))))
#define SETEAR_BIT_AL_JUGADOR(%0,%1) (JUGADOR_VALIDO(%1) && (%0 |= (1 << (%1 & 31))))
#define ELIMINAR_BIT_DEL_JUGADOR(%0,%1) (JUGADOR_VALIDO(%1) && (%0 &=~ (1 << (%1 & 31))))
// _______
//
// ENUMS
// _______
enum _: MAX_ESTADISTICAS
{
KILLS,
MUERTES,
HEADSHOTS,
FAKASOS,
PUNTOS_DE_RANK
};
// __________________
//
// VARIABLES Y CVARS
// __________________
new g_estadistica[MAX_PLAYERS+1][MAX_ESTADISTICAS];
new g_conectado;
new g_max_jugadores;
new cvar_suicidio, cvar_ignorar_bots;
// - My/SQL -
new const data_sql[][] = { "host", "usuario", "constrasenya", "base de datos", "tabla_principal", "tabla_de_jugadores_registrados" };
new Handle: g_sql_tuple, Handle: g_sql_conexion, g_sql_txt_query[605], g_sql_error[251], g_sql_jugadores_registrados;
new g_usuario[MAX_PLAYERS+1][32], bool: g_logueado[MAX_PLAYERS+1];
// ______________________
//
// FUNCIONES PRINCIPALES
// ______________________
public plugin_init()
{
register_plugin("TOP15 - MYSQL", "1.0", "Emanuelitop15");
register_event("HLTV", "ev_inicio_de_ronda", "a", "1=0", "2=0");
register_event("DeathMsg", "ev_muerte", "a", "1>0");
RegisterHam(Ham_Killed, "player", "ham_jugador_asesinado", .Post = false);
RegisterHam(Ham_Killed, "player", "ham_jugador_asesinado_post", .Post = true);
register_clcmd("say /rank", "clcmd_rank");
register_clcmd("say /top15", "clcmd_top15");
cvar_suicidio = register_cvar("topsql_contar_suicidio", "0"); // Si te suicidas cuenta como una Muerte.
cvar_ignorar_bots = register_cvar("topsql_ignorar_bots", "0"); // 1: No permite a los bots que se cargen / guarden sus datos. (Tampoco se los argega a la tabla) | 0: Permite todo lo mencionado anteriormente.
g_max_jugadores = get_maxplayers();
MySQL_INIT();
}
public client_putinserver(id)
{
SETEAR_BIT_AL_JUGADOR(g_conectado, id);
new s;
for (s = 0; s < MAX_ESTADISTICAS; s++)
g_estadistica[id][s] = 0;
g_logueado[id] = false;
get_user_name(id, g_usuario[id], charsmax(g_usuario[]));
jugador_post_conexion(id);
}
jugador_post_conexion(id)
{
if (get_pcvar_num(cvar_ignorar_bots) && is_user_bot(id))
return;
set_task(0.2, "cargar_datos", id);
}
public client_disconnected(id)
{
guardar_datos(id);
/*if (!OBTENER_BIT_DEL_JUGADOR(g_conectado, id))
return;
ELIMINAR_BIT_DEL_JUGADOR(g_conectado, id);*/
JUGADOR_CONECTADO(id, .eliminar_bit = true);
}
// ________
//
// EVENTOS
// ________
public ev_inicio_de_ronda()
{
new id;
for (id = 1; id <= g_max_jugadores; id++)
guardar_datos(id);
}
public ev_muerte()
{
new id, sz_arma[8];
id = read_data(1);
read_data(4, sz_arma, charsmax(sz_arma));
if (is_user_connected(id) && equal(sz_arma, "knife"))
g_estadistica[id][FAKASOS]++;
}
public plugin_end()
{
SQL_FreeHandle(g_sql_tuple);
SQL_FreeHandle(g_sql_conexion);
}
// _______
//
// HAMS
// _______
public ham_jugador_asesinado(victima, atacante)
{
if (!JUGADOR_CONECTADO(atacante) || (!get_pcvar_num(cvar_suicidio) && victima == atacante) || get_user_team(atacante) == get_user_team(victima))
return HAM_IGNORED;
if (victima != atacante) g_estadistica[atacante][KILLS]++;
g_estadistica[victima][MUERTES]++;
return HAM_HANDLED;
}
public ham_jugador_asesinado_post(victima, atacante)
{
if (!JUGADOR_CONECTADO(atacante) || victima == atacante || get_user_team(atacante) == get_user_team(victima))
return HAM_IGNORED;
// Headshot
if (get_pdata_int(victima, 75, 5) == HIT_HEAD)
g_estadistica[atacante][HEADSHOTS]++;
return HAM_HANDLED;
}
// ______________________
//
// FUNCIONES SECUNDARIAS
// ______________________
public cargar_datos(id)
{
if (!JUGADOR_CONECTADO(id))
return PLUGIN_HANDLED;
new Handle: query;
query = SQL_PrepareQuery(g_sql_conexion, "SELECT * FROM `%s` WHERE `Jugador`=^"%s^"", data_sql[4], g_usuario[id]);
if (!SQL_Execute(query))
{
SQL_ERROR(query, _, _, "cargar_datos(id)", g_usuario[id]);
return PLUGIN_HANDLED;
}
if (!SQL_NumResults(query))
{
g_logueado[id] = true;
insertar_jugador_a_la_tabla(id);
SQL_FreeHandle(query);
}
else
{
g_logueado[id] = true;
//SQL_ReadResult(0, nombre, 31);
g_estadistica[id][KILLS] = SQL_ReadResult(query, 1);
g_estadistica[id][MUERTES] = SQL_ReadResult(query, 2);
g_estadistica[id][HEADSHOTS] = SQL_ReadResult(query, 3);
g_estadistica[id][FAKASOS] = SQL_ReadResult(query, 4);
g_estadistica[id][PUNTOS_DE_RANK] = SQL_ReadResult(query, 5);
SQL_FreeHandle(query);
}
return PLUGIN_HANDLED;
}
public guardar_datos(id)
{
if (!JUGADOR_CONECTADO(id) || !g_logueado[id])
return PLUGIN_HANDLED;
// Se que ya esta la variable de logueado y en teoria los bots no deberian guardar datos,
// pero si se cambia a la mitad de una partida hacemos que tenga efecto al momento. [sino solo comenta las dos linea de abajo]
if (get_pcvar_num(cvar_ignorar_bots) && is_user_bot(id))
return PLUGIN_HANDLED;
// Seteamos los puntos de rank
g_estadistica[id][PUNTOS_DE_RANK] = (g_estadistica[id][KILLS] + g_estadistica[id][HEADSHOTS] + g_estadistica[id][FAKASOS]) - g_estadistica[id][MUERTES];
new Handle: query; query = SQL_PrepareQuery(g_sql_conexion,
"UPDATE `%s` \
SET \
Kills='%d', \
Muertes='%d', \
Headshots='%d', \
Fakasos='%d', \
PuntosDeRank='%d' \
WHERE `Jugador`=^"%s^"", data_sql[4], g_estadistica[id][KILLS], g_estadistica[id][MUERTES], g_estadistica[id][HEADSHOTS], g_estadistica[id][FAKASOS], g_estadistica[id][PUNTOS_DE_RANK], g_usuario[id]);
if (!SQL_Execute(query))
SQL_ERROR(query, _,_, "guardar_datos(id)", g_usuario[id]);
else
SQL_FreeHandle(query);
return PLUGIN_HANDLED;
}
insertar_jugador_a_la_tabla(id)
{
new Handle: query;
query = SQL_PrepareQuery(g_sql_conexion, "INSERT INTO `%s` (Jugador) VALUES (^"%s^")", data_sql[4], g_usuario[id]);
if (!SQL_Execute(query))
{
SQL_ERROR(query, _, _, "insertar_jugador_a_la_tabla(id)", g_usuario[id]);
return;
}
SQL_FreeHandle(query);
log_to_file("SQL_JUGADORES_REGISTRADOS.txt", "[JUGADOR: %s] Añadido a la tabla.", g_usuario[id]);
// Aumentamos el valor en la tabla donde guardaremos la cantidad de usuarios registrados
g_sql_jugadores_registrados++;
query = SQL_PrepareQuery(g_sql_conexion, "UPDATE `%s` SET `JugadoresRegistrados`='%d'", data_sql[5], g_sql_jugadores_registrados);
if (!SQL_Execute(query))
{
SQL_ERROR(query, data_sql[5], _, "insertar_jugador_a_la_tabla(id)", g_usuario[id]);
return;
}
SQL_FreeHandle(query);
log_to_file("SQL_NUMERO_DE_JUGADORES_REGISTRADOS.txt", "total: %d", g_sql_jugadores_registrados);
}
MySQL_INIT()
{
new error;
#if defined MODO_MYSQL
g_sql_tuple = SQL_MakeDbTuple(data_sql[0], data_sql[1], data_sql[2], data_sql[3]);
if (!g_sql_tuple)
{
log_amx("[MySQL] Error al intentar conectar con la base de datos, revisa que los datos esten escritos correctamente.");
set_fail_state("[MySQL] Error al intentar conectar con la base de datos, revisa que los datos esten escritos correctamente.");
pause("a");
return;
}
#else
new get_tipo[12];
SQL_SetAffinity("sqlite");
SQL_GetAffinity(get_tipo, sizeof (get_tipo));
g_sql_tuple = SQL_MakeDbTuple("", "", "", "sql_bd_top15");
if (!equali(get_tipo, "sqlite"))
{
log_amx("[SQL] Error al intentar conectar con la base de datos, revisa que los datos esten escritos correctamente.");
set_fail_state("[SQL] Error al intentar conectar con la base de datos, revisa que los datos esten escritos correctamente.");
pause("a");
return;
}
#endif
g_sql_conexion = SQL_Connect(g_sql_tuple, error, g_sql_error, charsmax(g_sql_error));
if (g_sql_conexion == Empty_Handle)
{
server_print("[SQL] Error al crear la conexion.");
set_fail_state("[SQL] Error al crear la conexion.");
pause("a");
return;
}
// Si todo salió bien creamos las tablas automaticamente
MySQL_CREAR_TABLAS();
}
MySQL_CREAR_TABLAS()
{
static len;
len = 0;
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "CREATE TABLE IF NOT EXISTS `%s`", data_sql[4]);
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, " (");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "Jugador varchar(32) NOT NULL UNIQUE, ");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "Kills int NOT NULL DEFAULT '0', ");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "Muertes int NOT NULL DEFAULT '0', ");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "Headshots int NOT NULL DEFAULT '0', ");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "Fakasos int NOT NULL DEFAULT '0', ");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "PuntosDeRank int NOT NULL DEFAULT '0'");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, " )");
new Handle: query;
query = SQL_PrepareQuery(g_sql_conexion, g_sql_txt_query);
if (!SQL_Execute(query))
{
SQL_ERROR(query, _, _, "MySQL_CREAR_TABLAS()", "");
return;
}
SQL_FreeHandle(query);
g_sql_txt_query[0] = EOS;
len = 0;
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "CREATE TABLE IF NOT EXISTS `%s`", data_sql[5]);
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, " (");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, "JugadoresRegistrados int NOT NULL UNIQUE");
len += formatex(g_sql_txt_query[len], charsmax(g_sql_txt_query) - len, " )");
query = SQL_PrepareQuery(g_sql_conexion, g_sql_txt_query);
if (!SQL_Execute(query))
{
SQL_ERROR(query, _, _, "MySQL_CREAR_TABLAS()", "");
return;
}
SQL_FreeHandle(query);
// Si tenemos ya jugadores registramos obtenemos el numero total de ello
g_sql_jugadores_registrados = 0;
query = SQL_PrepareQuery(g_sql_conexion, "SELECT `JugadoresRegistrados` FROM `%s`", data_sql[5]);
if (!SQL_Execute(query))
{
SQL_ERROR(query, data_sql[5], _, "MySQL_CREAR_TABLAS()", "");
return;
}
if (SQL_NumResults(query))
{
g_sql_jugadores_registrados = SQL_ReadResult(query, 0);
SQL_FreeHandle(query);
}
else
{
SQL_FreeHandle(query);
query = SQL_PrepareQuery(g_sql_conexion, "INSERT INTO `%s` (JugadoresRegistrados) VALUES (0)", data_sql[5]);
if (!SQL_Execute(query))
{
SQL_ERROR(query, data_sql[5], _, "MySQL_CREAR_TABLAS()", "");
return;
}
SQL_FreeHandle(query);
}
}
public clcmd_top15(id)
{
TOP15(id);
return PLUGIN_HANDLED;
}
public clcmd_rank(id)
{
MENU_RANK(id);
return PLUGIN_HANDLED;
}
MENU_RANK(id)
{
new menu, sz_txt[211], sz_rank[64];
iRANK(id, sz_rank, charsmax(sz_rank));
formatex(sz_txt, charsmax(sz_txt), "\d+\r Mi Rank^n^n\
\y+\w Rank:\r %s^n\
\y+\w Kills:\r %s^n\
\y+\w Muertes:\r %s^n\
\y+\w Headshots:\r %s^n\
\y+\w Kills con cuchillo:\r %s^n",
sz_rank, PUNTO(g_estadistica[id][KILLS]), PUNTO(g_estadistica[id][MUERTES]), PUNTO(g_estadistica[id][HEADSHOTS]), PUNTO(g_estadistica[id][FAKASOS]));
menu = menu_create(sz_txt, "hdr_menu_rank");
menu_additem(menu, "Cerrar menú");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
menu_display(id, menu);
}
public hdr_menu_rank(id, menuid, item)
{
if (!JUGADOR_CONECTADO(id))
{
menu_destroy(menuid);
return PLUGIN_HANDLED;
}
menu_destroy(menuid);
return PLUGIN_HANDLED;
}
TOP15(id)
{
new Handle: query;
query = SQL_PrepareQuery(g_sql_conexion, "SELECT * FROM `%s` ORDER BY `PuntosDeRank` DESC LIMIT 15", data_sql[4]);
if (!SQL_Execute(query))
{
client_print_color(id, 0, "^4[TOP 15]^1 No es posible ver el TOP en este momento.");
SQL_ERROR(query, _, _, "TOP15(id)", g_usuario[id]);
return;
}
else if (!SQL_NumResults(query))
{
SQL_FreeHandle(query);
client_print_color(id, 0, "^4[TOP 15]^1 No es posible ver el TOP en este momento.");
return;
}
else
{
static szmotd[9000];
new len, nombre[32], pts;
new posicion; posicion = 0;
// Edicion del MOTD
enum { COLOR_LETRAS = 0, COLOR_LETRAS_DEL_TITULO, COLOR_DEL_FONDO, COLOR_GENERAL, MAX_VARIEDAD };
new colores[MAX_VARIEDAD][32], tipo_de_letra[11];
format(colores[COLOR_LETRAS], 31, "FFFFFF");
format(colores[COLOR_LETRAS_DEL_TITULO], 31, "FFA40F");
format(colores[COLOR_GENERAL], 31, "890A0A");
format(colores[COLOR_DEL_FONDO], 31, "0B0B0B");
format(tipo_de_letra, charsmax(tipo_de_letra), "Century Gothic");
// Formato del MOTD
len = format(szmotd[len], charsmax(szmotd) - len, "<STYLE>\
body\
{background:#%s;\
color:#%s;\
font-family:'%s'}\
table\
{width:100%%;\
line-height:280%%;\
font-size:13px}\
.q\
{border:4px solid #%s}\
.b\
{background:#%s}\
</STYLE>\
<table cellpadding=0 cellspacing=1 border=0>", colores[COLOR_DEL_FONDO], colores[COLOR_LETRAS], tipo_de_letra, colores[COLOR_DEL_FONDO], colores[COLOR_LETRAS]);
// Detalles del MOTD
len += format(szmotd[len], charsmax(szmotd) - len, "<tr align=center bgcolor=#%s>\
<th width=1%%>\
<p style='color:#%s'> # </p>\
<th width=6%% align=center>\
<p style='color:#%s'> Jugador </p>\
<th width=8%% align=center>\
<p style='color:#%s'> Puntos de Rank</p>", colores[COLOR_GENERAL], colores[COLOR_LETRAS_DEL_TITULO], colores[COLOR_LETRAS_DEL_TITULO], colores[COLOR_LETRAS_DEL_TITULO]);
while (SQL_MoreResults(query))
{
posicion++;
SQL_ReadResult(query, 0, nombre, charsmax(nombre));
pts = SQL_ReadResult(query, 5);
// Info del Jugador
len += format(szmotd[len], charsmax(szmotd) - len, "<tr align=center>\
<td>\
%d\
<td align=center>\
%s\
<td>\
%s", posicion, nombre, PUNTO(pts));
SQL_NextRow(query);
}
SQL_FreeHandle(query);
show_motd(id, szmotd, "TOP 15");
}
}
// _________
//
// EXTRAS
// _________
JUGADOR_CONECTADO(id, bool: eliminar_bit = false)
{
if (OBTENER_BIT_DEL_JUGADOR(g_conectado, id))
{
if (eliminar_bit) ELIMINAR_BIT_DEL_JUGADOR(g_conectado, id);
return true;
}
return false;
}
SQL_ERROR(Handle:query, tabla[] = "", len_tabla = 20, funcion[], j[]/*, linea_de_la_funcion[] = "nulo"*/)
{
/* seria la tabla principal de todo, por ende lo dejo por defecto para rellenar este campo */
if (!strlen(tabla))
format(tabla, len_tabla, data_sql[4]);
SQL_QueryError(query, g_sql_error, charsmax(g_sql_error));
if (!strlen(j))
{
server_print("[SQL] [TABLA: %s]: Error '%s' en la funcion: %s", tabla, g_sql_error, funcion);
log_to_file("SQL_ERROR.txt", "[TABLA: %s] ERROR '%s' EN LA FUNCION: %s", tabla, g_sql_error, funcion);
}
else
{
server_print("[SQL] [TABLA: %s] [JUGADOR: %s]: Error '%s' en la funcion: %s", tabla, j, g_sql_error, funcion);
log_to_file("SQL_ERROR.txt", "[TABLA: %s] [JUGADOR: %s] ERROR '%s' EN LA FUNCION: %s", tabla, j, g_sql_error, funcion);
}
SQL_FreeHandle(query);
}
stock PUNTO(n)
{
new count, i, str[29], str2[35], len
num_to_str(n, str, charsmax(str))
len = strlen(str)
for (i = 0; i < len; i++)
{
if (i != 0 && ((len - i) %3 == 0))
{
add(str2, charsmax(str2), ".", 1)
count++
add(str2[i+count], 1, str[i], 1)
}
else add(str2[i+count], 1, str[i], 1)
}
return str2;
}
iRANK(id, str[], maxlen)
{
new Handle: query;
query = SQL_PrepareQuery(g_sql_conexion, "SELECT (COUNT(*) + 1) AS pos FROM `%s` WHERE `PuntosDeRank` > '%d'", data_sql[4], g_estadistica[id][PUNTOS_DE_RANK]);
format(str, maxlen, "No estas rankeado");
if (!SQL_Execute(query))
{
SQL_ERROR(query, _, _, "iRANK(id, str[], maxlen)", g_usuario[id]);
return;
}
if (SQL_NumResults(query))
{
format(str, maxlen, "%d de %d \d[Puntos de Rank: %s]", SQL_ReadResult(query, 0), g_sql_jugadores_registrados, PUNTO(g_estadistica[id][PUNTOS_DE_RANK]));
SQL_FreeHandle(query);
}
}
___________________________________
SI NECESITAS UN PLUGIN TE LO HAGO $$$
COMUNICATE A MI DISCORD: emanuelitop15
SI NECESITAS UN PLUGIN TE LO HAGO $$$
COMUNICATE A MI DISCORD: emanuelitop15