Senior Member
|
06-05-2018
, 03:18
qServerinfo count disconnected players bug
|
#1
|
Hello all. I'm using qserverinfo plugin. This plugin save server info to mysql like player numbers, map and etc. But, if i connect to server alone, and then disconnected i get -1 player in SQL... Can someone fix this? It should be not -1 but 0 players...
PHP Code:
/*
* < Coded by grd aka quark >
*
* Description
* This plugin will insert into a MYSQL Database server information as
* hostname, map and players for now.
*
*
* Contacts
* Steam: grdPTFMAPS
* Mail: [email protected]
* Website: www.joserodrigues.tk
*
*
* Changelog
* 0.1 - First release.
* 0.2 - Fixed bug when change map.
* 0.3 - Added server IP Saving.
* - Removed Ignore HLTV/BOTS.
* - Fixed Player Count. ( I guess. )
* 0.4 - Removed Server ID.
* - Set Server IP as Primary key.
* - Changed way to get Server IP.
* - Added maxplayers.
* - Fixed Player count. ( Testing. )
* 0.5 - Added log to amx.
* - Fixed server IP.
* 0.6 - Fixed Player Couting
*
*
* Original Thread
* https://forums.alliedmods.net/showthread.php?p=2025512
*
*/
/* Includes */
#include <amxmodx>
#include <sqlx>
/* --------- */
/* Table Configuration */
new const QSINFO_TABLE[] = "qserverinfo";
/* ----------------------------- */
/* Connection Handle/Variables */
new Handle:qSi_SqlTuple;
/* ----------------------------- */
/* Variables */
new g_pcvarHost;
new g_pcvaruUser;
new g_pcvarPass;
new g_pcvarDB;
new szMapName[ 32 ];
new szAddress[ 32 ];
new szHostName[ 64 ];
new g_iPlayers;
new p_Address;
new p_Maxplayers;
/* ----------------------------- */
public plugin_init()
{
register_plugin("qServerinfo", "0.6", "quark");
/* Register Cvars */
g_pcvarHost = register_cvar( "qSi_host", "localhost", FCVAR_PROTECTED );
g_pcvaruUser = register_cvar( "qSi_user", "user", FCVAR_PROTECTED );
g_pcvarPass = register_cvar( "qSi_pass", "pass", FCVAR_PROTECTED );
g_pcvarDB = register_cvar( "qSi_db", "db", FCVAR_PROTECTED );
/* ---------------------------------------------------------------------------------- */
p_Maxplayers = get_maxplayers();
p_Address = get_cvar_pointer("net_address");
g_iPlayers=0;
SqlInit();
}
public SqlInit()
{
/* SQL Connection */
new szHost[ 32 ];
new szUser[ 32 ];
new szPass[ 32 ];
new szDB[ 32 ];
get_pcvar_string( g_pcvarHost, szHost, charsmax( szHost ) );
get_pcvar_string( g_pcvaruUser, szUser, charsmax( szUser ) );
get_pcvar_string( g_pcvarPass, szPass, charsmax( szPass ) );
get_pcvar_string( g_pcvarDB, szDB, charsmax( szDB ) );
qSi_SqlTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
new g_Error[ 512 ];
new ErrorCode;
new Handle:SqlConnection = SQL_Connect( qSi_SqlTuple, ErrorCode, g_Error, charsmax( g_Error ) );
/* ---------------------------------------------------------------------------------- */
if( SqlConnection == Empty_Handle )
set_fail_state( g_Error );
/* Create the SQL Table */
new Handle:Queries;
Queries = SQL_PrepareQuery( SqlConnection,
"CREATE TABLE IF NOT EXISTS %s \
( ip VARCHAR( 32 ) PRIMARY KEY,\
hostname VARCHAR( 64 ),\
map VARCHAR( 32 ),\
players INT( 11 ),\
maxplayers int( 11 ) )",
QSINFO_TABLE );
/* ----------------------------- */
if( !SQL_Execute( Queries ) )
{
SQL_QueryError( Queries, g_Error, charsmax( g_Error ) );
set_fail_state( g_Error );
}
/* Some delay so hostname won't be "Half Life" */
set_task(5.0, "CheckqSi");
/* ----------------------------------------- */
SQL_FreeHandle( Queries );
SQL_FreeHandle( SqlConnection );
}
public CheckqSi()
{
get_pcvar_string(p_Address,szAddress,charsmax(szAddress));
/* I only use this so when the results come, i can create */
/* the row for the specific server ID */
/* It will check if the server ID already exists in the database */
new szTemp[ 512 ];
format( szTemp, charsmax( szTemp ),
"SELECT `hostname` FROM %s WHERE `ip`='%s'",
QSINFO_TABLE, szAddress );
SQL_ThreadQuery( qSi_SqlTuple, "LoadqSi_Results", szTemp );
/* ------------------------------------------------------------ */
}
public LoadqSi_Results( FailState, Handle:Query, Error[ ], Errcode )
{
if( SQL_IsFail( FailState, Errcode, Error ) )
return;
/* Create row for the server ID if not found */
if( SQL_NumResults( Query ) < 1 )
{
get_mapname( szMapName, charsmax( szMapName ) );
get_cvar_string( "hostname", szHostName, charsmax( szHostName ) );
get_pcvar_string(p_Address,szAddress,charsmax(szAddress));
new szTemp[ 512 ]
format( szTemp, charsmax( szTemp ),
"INSERT INTO %s ( ip, hostname, map, players, maxplayers )\
VALUES( '%s', '%s', '%s', '%d', '%d' )",
QSINFO_TABLE, szAddress, szHostName, szMapName, g_iPlayers, p_Maxplayers);
SQL_ThreadQuery( qSi_SqlTuple, "IgnoreHandle", szTemp );
log_amx("IP: %s | Hostname: %s | Map: %s | Players: %d | Maxplayers: %d", szAddress, szHostName, szMapName, g_iPlayers, p_Maxplayers);
}
/* ----------------------------------------- */
/* If the server ID already has an row, it will update the info */
else
set_task(5.0, "UpdateqSi");
/* ----------------------------------------- */
}
public UpdateqSi()
{
/* Update Server Information */
get_mapname( szMapName, charsmax( szMapName ) );
get_cvar_string( "hostname", szHostName, charsmax( szHostName ) );
get_pcvar_string(p_Address,szAddress,charsmax(szAddress));
new szTemp[ 512 ];
formatex( szTemp, charsmax( szTemp ),
"UPDATE `%s` SET `hostname`='%s', `map`='%s', `players`='%d', `maxplayers`='%d' WHERE `ip`='%s'",
QSINFO_TABLE, szHostName, szMapName, g_iPlayers, p_Maxplayers, szAddress);
SQL_ThreadQuery( qSi_SqlTuple, "IgnoreHandle", szTemp );
log_amx("IP: %s | Hostname: %s | Map: %s | Players: %d | Maxplayers: %d", szAddress, szHostName, szMapName, g_iPlayers, p_Maxplayers);
/* ----------------------------------------- */
}
public client_putinserver(player)
{
set_task(1.0, "CheckUser", player);
}
public CheckUser(player)
{
if(is_user_connected(player))
{
g_iPlayers++;
UpdateqSiPlayers();
}
}
public client_disconnect(player)
{
g_iPlayers--;
UpdateqSiPlayers();
}
public UpdateqSiPlayers()
{
/* Update the Players num */
new szTemp[ 512 ];
formatex( szTemp, charsmax( szTemp ),
"UPDATE `%s` SET `players`='%d' WHERE `ip`='%s'",
QSINFO_TABLE, g_iPlayers, szAddress );
SQL_ThreadQuery( qSi_SqlTuple, "IgnoreHandle", szTemp );
/* -------------------------------- */
}
public IgnoreHandle( FailState, Handle:Query, Error[ ], Errcode, Data[ ], DataSize )
{
if(FailState)
{
log_amx(Error);
}
SQL_FreeHandle( Query );
}
public plugin_end()
g_iPlayers=0;
stock SQL_IsFail( FailState, Errcode, Error[ ] )
{
if( FailState == TQUERY_CONNECT_FAILED )
{
log_amx( "[qServerinfo] Could not connect to SQL database: %s", Error );
return true;
}
if( FailState == TQUERY_QUERY_FAILED )
{
log_amx( "[qServerinfo] Query failed: %s", Error );
return true;
}
if( Errcode )
{
log_amx( "[qServerinfo] Error on query: %s", Error );
return true;
}
return false;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang2070\\ f0\\ fs16 \n\\ par }
*/
|
|