Code:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
new AUTH[] = "Gizmo"
new PLUGIN_NAME[] = "Tidtest"
new VERSION[] = "0.1b"
new Handle:g_SqlX
new g_table[32]
new Float:g_onlinetime[33]
new maxplayers
new g_steamid[32]
public plugin_init()
{
register_plugin(PLUGIN_NAME, VERSION, AUTH)
register_cvar(PLUGIN_NAME, VERSION, FCVAR_SERVER | FCVAR_SPONLY)
// Sql settings
register_cvar("pi_sql_host", "127.0.0.1")
register_cvar("pi_sql_user", "*****")
register_cvar("pi_sql_pass", "*****")
register_cvar("pi_sql_db", "amx")
register_cvar("pi_sql_table", "amx_tidtest")
//register_logevent ("EndofRound", 2, "1=Round_End")//"0=World triggered" ,
maxplayers = get_maxplayers()
new modname[32]
get_modname(modname,31)
if(equali("cstrike",modname))
{
register_event("SendAudio","EndofRound","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw")
}
else if(equali("ns",modname))
{
register_event("GameStatus", "EndofRound", "ab", "1=2")
}
else if(equali("dod",modname))
{
register_event("RoundState","EndofRound","a","1=3","1=4")
}
//Execute configfile for tidtest
new configsDir[64]
get_configsdir(configsDir, 63)
server_cmd("exec %s/tidtest.cfg", configsDir)
server_exec()
}
public plugin_cfg()
{
new host[64], user[64], pass[64], db[64]
get_cvar_string("pi_sql_host", host, 63)
get_cvar_string("pi_sql_user", user, 63)
get_cvar_string("pi_sql_pass", pass, 63)
get_cvar_string("pi_sql_db", db, 63)
g_SqlX = SQL_MakeDbTuple(host, user, pass, db)
set_task(0.1, "create_table")
}
public create_table()
{
new errnum, error[255]
get_cvar_string("pi_sql_table", g_table, 31)
new Handle:db = SQL_Connect(g_SqlX, errnum, error, 254)
if (!db)
{
server_print("Connection failed [%d] %s", errnum, error)
return
}
new Handle:query = SQL_PrepareQuery(db, "CREATE TABLE IF NOT EXISTS `%s` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `authid` VARCHAR(32) NOT NULL DEFAULT '0' , `time` INT(10) UNSIGNED NOT NULL DEFAULT '0' , `connects` INT(10) UNSIGNED NOT NULL DEFAULT '0' , `rounds` INT(10) UNSIGNED NOT NULL DEFAULT '0') ENGINE = MYISAM" , g_table )
if (!SQL_Execute(query))
{
errnum = SQL_QueryError(query, error, 254)
server_print("Query failed [%d] %s", errnum, error)
SQL_FreeHandle(query)
SQL_FreeHandle(db)
return
}
SQL_FreeHandle(query)
SQL_FreeHandle(db)
}
///////////////////////////////////////////////////////////
public client_putinserver(id)
{
if(is_user_connected(id) && !is_user_bot(id))
{
get_user_authid(id, g_steamid, 31)
set_task(0.1, "select_user")
g_onlinetime[id] = get_gametime() - 3.0
}
return PLUGIN_CONTINUE
}
public select_user(id)
{
new query[512]
new data[1]
format(query, 511, "SELECT authid FROM `%s` WHERE `authid` = '%s'", g_table, g_steamid)
data[0] = id
SQL_ThreadQuery(g_SqlX, "insert_user", query, data, 1)
return
}
public insert_user(failstate, Handle:query, error[], errnum, data[], size)
{
new id = data[0]
if (failstate)
{
new szQuery[256]
MySqlX_ThreadError( query, szQuery, error, errnum, failstate, 1 )
}
else
{
new result = SQL_NumResults(query)
if(result == 0)
{
new query[512], data[1]
format(query, 511, "INSERT INTO `%s` ( `authid` , `time` , `connects` , `rounds`) VALUES ( '%s', '0', '1' , '0' )", g_table, g_steamid)
data[0] = id
SQL_ThreadQuery(g_SqlX, "insert_to_table", query, data, 1)
}
else
{
new query[512], data[1]
format(query, 511, "UPDATE `%s` SET `connects`=connects+1 WHERE `authid`='%s'", g_table, g_steamid)
data[0] = id
SQL_ThreadQuery(g_SqlX, "update_table", query, data, 1)
}
}
}
public insert_to_table(failstate, Handle:query, error[], errnum, data[], size)
{
//new id = data[0]
if (failstate)
{
new szQuery[256]
MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 2)
}
SQL_FreeHandle(query)
}
public update_table(failstate, Handle:query, error[], errnum, data[], size)
{
//new id = data[0]
if (failstate)
{
new szQuery[256]
MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 3)
}
SQL_FreeHandle(query)
}
///////////////////////////////////////////////////////////
public EndofRound()
{
new Float:gametime = get_gametime()
for(new id = 1; id <= maxplayers; id++)
if( is_user_connected(id) && !is_user_bot(id))
{
rounds (id, floatround(gametime - g_onlinetime[id]))
}
}
rounds(id, onlinetime)
{
new query[512], data[1]
format(query, 511, "UPDATE `%s` SET `time`=time+%i, `rounds`=rounds+1 WHERE `authid`='%s'", g_table, onlinetime, g_steamid)
data[0] = id
SQL_ThreadQuery(g_SqlX, "round_update", query, data, 1)
new Float:gametime = get_gametime()
g_onlinetime[id] = gametime
}
public round_update(failstate, Handle:query, error[], errnum, data[], size)
{
//new id = data[0]
if (failstate)
{
new szQuery[256]
MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 4)
}
SQL_FreeHandle(query)
}
///////////////////////////////////////////////////////////
public client_disconnect(id)
{
if(!is_user_bot(id))
_client_disconnect(id, floatround(get_gametime() - g_onlinetime[id]))
g_onlinetime[id] = 0.0
return PLUGIN_CONTINUE
}
_client_disconnect(id, onlinetime)
{
new query[512], data[1]
format(query, 511, "UPDATE `%s` SET `time`=time+%i WHERE `authid`='%s'", g_table, onlinetime, g_steamid)
data[0] = id
SQL_ThreadQuery(g_SqlX, "disconnect_update", query, data, 1)
}
public disconnect_update(failstate, Handle:query, error[], errnum, data[], size)
{
//new id = data[0]
if (failstate)
{
new szQuery[256]
MySqlX_ThreadError(query, szQuery, error, errnum, failstate, 5)
}
SQL_FreeHandle(query)
}
///////////////////////////////////////////////////////////
//update user on map change but not 2 times
public plugin_end()
{
new Float:gametime = get_gametime()
for(new id = 1; id <= maxplayers; id++)
if( is_user_connected(id) )
endquery(floatround(gametime - g_onlinetime[id]))
SQL_FreeHandle(g_SqlX)
return
}
endquery(onlinetime)
{
server_print("time: %i", onlinetime)
new errnum, error[255]
new Handle:db = SQL_Connect(g_SqlX, errnum, error, 254)
if (!db)
{
server_print("Connection failed [%d] %s", errnum, error)
return
}
new Handle:query = SQL_PrepareQuery(db, "UPDATE `%s` SET `time`=time+%i WHERE `authid`='%s'", g_table, onlinetime, g_steamid)
server_print("Saved userinfo")
if (!SQL_Execute(query))
{
errnum = SQL_QueryError(query, error, 254)
server_print("Query failed [%d] %s", errnum, error)
SQL_FreeHandle(query)
SQL_FreeHandle(db)
return
}
SQL_FreeHandle(query)
SQL_FreeHandle(db)
}
///////////////////////////////////////////////////////////
MySqlX_ThreadError(Handle:query, szQuery[], error[], errnum, failstate, id)
{
if (failstate == TQUERY_CONNECT_FAILED)
{
server_print("TConnection failed!")
}
else if (failstate == TQUERY_QUERY_FAILED)
{
server_print("TQuery failed!")
}
server_print( "[MYSQLX] Threaded query error, location: %d", id );
server_print( "[MYSQLX] Message: %s (%d)", error, errnum );
server_print( "[MYSQLX] Query statement: %s ", szQuery );
SQL_FreeHandle(query)
}