https://amxx.pl/topi...a-staty-i-rank/
witam mam problem z pluginem na statystyki deathrun nie łączy się z baza
strona www działa
Spoiler
http://multimod.gameclan.pl/index.php
error
Spoiler
L 01/10/2020 - 14:15:22: [deathrun_stats.amxx] Error (2002): Can't connect to local MySQL se
L 01/10/2020 - 14:15:22: [AMXX] Plugin ("deathrun_stats.amxx") is setting itself as failed.
L 01/10/2020 - 14:15:22: [AMXX] Plugin says: Cant connect to database
L 01/10/2020 - 14:15:22: [AMXX] Displaying debug trace (plugin "deathrun_stats.amxx", version "0.6")
L 01/10/2020 - 14:15:22: [AMXX] Run time error 1: forced exit
L 01/10/2020 - 14:15:22: [AMXX] [0] mysql.inl::SQLx_Init (line 33)
L 01/10/2020 - 14:15:22: [AMXX] [1] db.inl::DB_Init (line 12)
L 01/10/2020 - 14:15:22: [AMXX] [2] deathrun_stats.sma::plugin_cfg (line 123)
kod mysql.inl
Spoiler
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <hamsandwich>
#include <sqlx>
stock SQL_PrepareString(const szQuery[], szOutPut[], size){
copy(szOutPut, size, szQuery);
replace_all(szOutPut, size, "'", "\'");
replace_all(szOutPut,size, "`", "\`");
replace_all(szOutPut,size, "\\", "\\\\");
}
SQLx_Init()<mysql>{
new szHost[32], szUser[32], szPass[32], szDB[32];
get_cvar_string("amx_drstats_host", szHost, 31);
get_cvar_string("amx_drstats_user", szUser, 31);
get_cvar_string("amx_drstats_pass", szPass, 31);
get_cvar_string("amx_drstats_db", szDB, 31);
gTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB);
if(gTuple == Empty_Handle){
set_fail_state("Cant create connection tuple");
}
new iErr, szError[32];
new Handle:link = SQL_Connect(gTuple, iErr, szError, 31);
if(link == Empty_Handle){
log_amx("Error (%d): %s", iErr, szError);
set_fail_state("Cant connect to database");
}
new Handle:query;
query = SQL_PrepareQuery(link,
"CREATE TABLE IF NOT EXISTS `runners`( \
id INT(11) UNSIGNED AUTO_INCREMENT,\
steamid VARCHAR(32) NOT NULL, \
nickname VARCHAR(32) NOT NULL, \
ip VARCHAR(32) NOT NULL, \
PRIMARY KEY(id) \
)");
SQL_Execute(query);
SQL_FreeHandle(query);
query = SQL_PrepareQuery(link,
"ALTER TABLE `runners` \
ADD nationality VARCHAR(3) NULL");
SQL_Execute(query);
SQL_FreeHandle(query);
query = SQL_PrepareQuery(link,
"CREATE TABLE IF NOT EXISTS `maps`( \
mid INT(11) UNSIGNED AUTO_INCREMENT,\
mapname VARCHAR(64) NOT NULL UNIQUE, \
games INT(11) NOT NULL, \
finishX INT(11) NOT NULL DEFAULT 0, \
finishY INT(11) NOT NULL DEFAULT 0, \
finishZ INT(11) NOT NULL DEFAULT 0, \
PRIMARY KEY(mid) \
)");
SQL_Execute(query);
SQL_FreeHandle(query);
query = SQL_PrepareQuery(link,
"CREATE TABLE IF NOT EXISTS `results`( \
id INT(11) UNSIGNED, \
mid INT(11) UNSIGNED, \
besttime INT(11) NOT NULL, \
games INT(11) NOT NULL, \
playedtime INT(11) NOT NULL, \
deaths INT(11) NOT NULL, \
FOREIGN KEY(id) REFERENCES `runners`(id) ON DELETE CASCADE, \
FOREIGN KEY(mid) REFERENCES `maps`(mid) ON DELETE CASCADE, \
PRIMARY KEY(id, mid) \
)");
SQL_Execute(query);
SQL_FreeHandle(query);
query = SQL_PrepareQuery(link,
"ALTER TABLE `results` \
ADD recorddate DATETIME NULL");
SQL_Execute(query);
SQL_FreeHandle(query);
SQL_FreeHandle(link);
get_mapname(gszMapname, charsmax(gszMapname));
formatex(gszQuery, charsmax(gszQuery), "INSERT INTO `maps`(mid, mapname, games) VALUES (0, '%s', 1) ON DUPLICATE KEY UPDATE games = games + 1", gszMapname);
SQL_ThreadQuery(gTuple, "handleUpdateMap", gszQuery);
}
public handleUpdateMap(failstate, Handle:query, error[], errnum, data[], size)<mysql>{
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
formatex(gszQuery, charsmax(gszQuery), "SELECT mid, games, finishX, finishY, finishZ FROM `maps` WHERE mapname='%s'", gszMapname);
SQL_ThreadQuery(gTuple, "handleSelectMap", gszQuery);
}
public handleSelectMap(failstate, Handle:query, error[], errnum, data[], size)<mysql>{
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
gMid = SQL_ReadResult(query, 0);
giGames = SQL_ReadResult(query, 1);
createFinishI( 0, SQL_ReadResult(query, 2), SQL_ReadResult(query, 3), SQL_ReadResult(query, 4));
for(new i=1;i<33; i++)
if(is_user_connected(i))
client_putinserver(i);
loadNshowTop15(0);
if(gszTop15Redirect[0]){
new szTemp[15];
formatex(szTemp, 14, "mid=%d", gMid);
add(gszTop15Redirect, charsmax(gszTop15Redirect), szTemp);
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/
kod db.inl
Spoiler
#include <amxmodx>
DB_Init(){
state mysql;
new szDB[32];
get_cvar_string("amx_drstats_db", szDB, 31);
if(contain(szDB, ".") > 0)
state sqlite;
SQLx_Init();
}
loadRunnerData(id){
if(!gbAuthorized[id]) return;
new data[1];
data[0] = id;
formatex(gszQuery, charsmax(gszQuery), "SELECT * FROM `results` WHERE id=%d AND mid=%d", giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleLoadData", gszQuery, data, sizeof(data));
}
saveRunnerData(id, updateBest = 0){
if(!gbAuthorized[id]) return;
if(updateBest){
giBestTime[id] = updateBest;
get_time("%Y-%m-%d %H:%M:%S", gszRecordTime[id], charsmax(gszRecordTime[]));
}
formatex(gszQuery, charsmax(gszQuery),
"UPDATE `results` SET besttime=%d, games=%d, playedtime=%d, deaths=%d, recorddate='%s' \
WHERE id=%d AND mid=%d",
giBestTime[id], giPlayedGames[id], getPlayedTime(id), getPlayerDeaths(id), gszRecordTime[id],
giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
//Create Handler
public handleCreateQuery(failstate, Handle:query, error[], errnum, data[], size)<mysql, sqlite>{
if(failstate != TQUERY_SUCCESS)
log_amx("SQL Creation error: %s",error);
}
public handleStandard(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL error: %s",error);
return;
}
}
loadPlayerId(id){
if(!gMid) return;
new szAuth[64];
new szField[32];
switch(get_pcvar_num(gcvarSave)){
case 1:{
get_user_authid(id, szAuth, 31);
szField = "steamid";
}
case 2:{
get_user_name(id, szAuth, 31);
SQL_PrepareString(szAuth, szAuth, 63);
szField = "nickname";
}
case 3:{
get_user_ip(id, szAuth, 31, 1);
szField = "ip";
}
}
new data[1];
data[0] = id;
formatex(gszQuery, charsmax(gszQuery), "SELECT id, ip, nationality FROM `runners` WHERE %s='%s'",szField, szAuth);
SQL_ThreadQuery(gTuple, "handleSelectRunner", gszQuery, data, sizeof(data));
}
getNationality(id, const szIP[], szCode[5]){
new szTemp[3];
if(geoip_code2_ex( szIP, szTemp)){
copy(szCode, 4, szTemp);
}
else{
get_user_info(id, "lang", szCode, 2);
SQL_PrepareString(szCode, szCode, 4);
}
}
public handleSelectRunner(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
new szCode[5];
if(SQL_MoreResults(query)){
client_authorized_db(id, SQL_ReadResult(query, 0));
SQL_ReadResult(query, 2, szCode, 1)
if(szCode[0] == 0){
new szIP[32];
SQL_ReadResult(query, 1, szIP, 31);
getNationality(id, szIP, szCode);
formatex(gszQuery, charsmax(gszQuery), "UPDATE `runners` SET nationality='%s' WHERE id=%d",szCode, giPid[id]);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}else{
new szAuth[32];
get_user_authid(id, szAuth, 31);
new szIP[32];
get_user_ip(id, szIP, 31, 1)
new szName[64];
get_user_name(id, szName, 31);
SQL_PrepareString(szName, szName, 63);
getNationality(id, szIP, szCode);
formatex(gszQuery, charsmax(gszQuery), "INSERT INTO `runners` VALUES (0, '%s', '%s', '%s', '%s')", szAuth, szName, szIP, szCode);
SQL_ThreadQuery(gTuple, "handleInsertRunner", gszQuery, data, size);
}
}
public handleInsertRunner(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
client_authorized_db(id , SQL_GetInsertId(query));
}
public handleLoadData(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
if(!is_user_connected(id)) return;
if(SQL_MoreResults(query)){
giBestTime[id] = SQL_ReadResult(query, 2);
giPlayedGames[id] = SQL_ReadResult(query, 3) + 1;
giPlayedTime[id] = SQL_ReadResult(query, 4);
giDeaths[id] = SQL_ReadResult(query, 5);
SQL_ReadResult(query, 6, gszRecordTime[id], charsmax(gszRecordTime[]));
}else{
giBestTime[id] = 0;
giPlayedGames[id] = 1;
giPlayedTime[id] = 0;
giDeaths[id] = 0;
gszRecordTime[id] = "";
formatex(gszQuery, charsmax(gszQuery), "INSERT INTO `results` VALUES (%d, %d, 0, 1, 0, 0, NULL)", giPid[id], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}
saveFinishOrigin(){
if(pev_valid(gEntFinish)){
new Float:fOrigin[3], iOrigin[3];
pev(gEntFinish, pev_origin, fOrigin);
FVecIVec(fOrigin, iOrigin);
formatex(gszQuery, charsmax(gszQuery), "UPDATE `maps` SET finishX = %d, finishY=%d, finishZ=%d WHERE mid=%d",
iOrigin[0], iOrigin[1], iOrigin[2], gMid);
SQL_ThreadQuery(gTuple, "handleStandard", gszQuery);
}
}
loadRank(id, const szFunc[]){
new fun = get_func_id(szFunc);
if(!fun) return;
formatex(gszQuery, charsmax(gszQuery), "SELECT COUNT(*) FROM `results` WHERE mid=%d AND besttime > 0 AND besttime < %d",
gMid, giBestTime[id]);
new data[2];
data[0] = id;
data[1] = fun;
SQL_ThreadQuery(gTuple, "handleLoadRank", gszQuery, data, sizeof(data));
}
public handleLoadRank(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
return;
}
new id = data[0];
new fun = data[1];
new rank = SQL_ReadResult(query, 0);
if(callfunc_begin_i(fun)){
callfunc_push_int(id);
callfunc_push_int(rank+1);
callfunc_end();
}
}
loadNshowTop15(id){
formatex(gszQuery, charsmax(gszQuery), "SELECT nickname, besttime FROM `results` JOIN `runners` ON `runners`.id=`results`.id WHERE mid=%d AND besttime ORDER BY besttime ASC LIMIT 15",
gMid, giBestTime[id]);
new data[1];
data[0] = id;
SQL_ThreadQuery(gTuple, "handleLoadTop15", gszQuery, data, sizeof(data));
}
public handleLoadTop15(failstate, Handle:query, error[], errnum, data[], size){
if(failstate != TQUERY_SUCCESS){
log_amx("SQL Insert error: %s",error);
}
new id = data[0];
if(!is_user_connected(id) && id!=0) return;
new iLen = 0, iMax = charsmax(gszMotd);
iLen += formatex(gszMotd[iLen], iMax-iLen, "<pre>");
iLen += formatex(gszMotd[iLen], iMax-iLen, "%L %L %L^n", id, "WORD_POS", id, "WORD_PLAYER", id, "WORD_TIME");
new i=1;
new iTime, szName[32], szTime[32];
while(SQL_MoreResults(query)){
SQL_ReadResult(query, 0, szName, 31);
iTime = SQL_ReadResult(query, 1);
getFormatedTime(iTime, szTime, 31);
iLen += formatex(gszMotd[iLen], iMax-iLen, "%-3d %-32s ", i, szName);
if(i == 1){
giBestTimeofMap = iTime;
iLen += formatex(gszMotd[iLen], iMax-iLen, " %-15s ", szTime);
if(id == 0) return;
}else{
iLen += formatex(gszMotd[iLen], iMax-iLen, " %-15s ", szTime);
getFormatedTime(iTime-giBestTimeofMap , szTime, 31);
iLen += formatex(gszMotd[iLen], iMax-iLen, "+%-15s", szTime);
}
iLen += formatex(gszMotd[iLen], iMax-iLen, "^n");
i++;
SQL_NextRow(query);
}
iLen += formatex(gszMotd[iLen], iMax-iLen, "</pre>");
show_motd(id, gszMotd, "Top15");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/


Dodatki SourceMod




Temat jest zamknięty










