AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Server hangs on mapchange :( (https://forums.alliedmods.net/showthread.php?t=29198)

Gizmo 05-31-2006 16:49

Server hangs on mapchange :(
 
Can anyone tell me why the server hangs on mapchange because of this plugin

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) }

Gizmo 06-02-2006 08:28

I found the problem.
As you can see i have a regular query at plugin_end for saving ppl at mapchange and another threaded query at client_disconnect.

The problem was that at plugin_end also client_disconnect is run so the query at plugin_end is unnecessary but even when i toke away the query at plugin_end the server still hangs at mapchange.
That was because if you run a threaded query on client_disconnect that is also run at plugin_end and that makes the server hang, probably because
the threaded query takes some time to finish and at plugin_end there is not time for that.

Im no expert at this but when i toke away the query at plugin_end and made the client_disconnect a regular query it works fine and saves the players excactly as i want it to.

Xanimos 06-02-2006 08:33

When you use SQL_ThreadQuery() you don't use SQL_FreeHandle(query)

Gizmo 06-02-2006 09:12

ok, thx i missed that.....


All times are GMT -4. The time now is 16:21.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.