Perdida de Datos [TTT]
#1
casi siempre se me pierden los datos (teniendo privilegios de admin me pasa a otros también con admin, sin admin no sé), cuando se me kickea por matar mal mayormente pasa cuando esta finalizando el mapa que quedan 10 segundos el servidor me expulsa por matar mal, imagino que el error estaría aquí:

Código PHP:
#include <amxmodx>
#include <hamsandwich>
#include <sqlx>
#include <ttt>

#pragma defclasslib sqlite sqlite
#pragma dynamic 32768
new const g_iPointValue[PLAYER_STATS-1] =
{
    
100,      // Game winning kills
    
150,      // Kills as Innocent // Right ones
    
100,      // Kills as Detective
    
100,      // Kills as Traitor
    
-100,     // Team kills
    
10,       // Times innocent
    
10,       // Times detective
    
10,       // Times traitor
    
50,       // Bomb planted
    
50,       // Bomb exploded
    
50        // Bomb defused
};            

new 
g_iPlayerStats[33][PLAYER_STATS], g_szPlayerName[33][40], cvar_statsg_pCommandMenuID1g_pCommandMenuID2;
new 
Handle:g_pSqlTupleTrie:g_tTop10Players[10];

public 
plugin_init()
{
    
register_plugin("[TTT] Stats System"TTT_VERSIONTTT_AUTHOR);

    
cvar_stats my_register_cvar("ttt_stats""2""Stats 0/1/2 off/MySQL/Sqlite. (Default: 2)");
    
// register_clcmd("say /ttttop", "show_top10");
    // register_clcmd("say_team /ttttop", "show_top10");
    // register_clcmd("say /tttstats", "show_stats");
    // register_clcmd("say_team /tttstats", "show_stats");

    
g_pCommandMenuID1 ttt_command_add("Top 10");
    
g_pCommandMenuID2 ttt_command_add("Your stats");

    
RegisterHamPlayer(Ham_Killed"Ham_Killed_post"1);
}

public 
plugin_cfg()
    
set_task(0.1"delayed_plugin_cfg");

public 
delayed_plugin_cfg()
{
    
MySQL_Init();
    for(new 
010i++)
        
g_tTop10Players[i] = TrieCreate();
    
MySQL_TOP10();
}

public 
plugin_natives()
{
    
register_library("ttt");
    
register_native("ttt_set_stats""_set_stats");
    
register_native("ttt_get_stats""_get_stats");
}

public 
plugin_end()
{
    if(
g_pSqlTuple)
        
SQL_FreeHandle(g_pSqlTuple);
    for(new 
010i++)
        
TrieDestroy(g_tTop10Players[i]);
}

public 
ttt_command_selected(idmenuidname[])
{
    if(
g_pCommandMenuID1 == menuid)
        
show_top10(id);
    else if(
g_pCommandMenuID2 == menuid)
        
show_stats(id);
}

public 
client_putinserver(id)
{
    
reset_client(id);
    
g_szPlayerName[id][0] = EOS;
    if(
is_user_bot(id))
        return;

    
get_user_name(idg_szPlayerName[id], charsmax(g_szPlayerName[]));
    
escape_mysql(g_szPlayerName[id], charsmax(g_szPlayerName[]));
    
MySQL_Load(id);
}

public 
client_disconnect(id)
{
    
MySQL_Save(id);
    
reset_client(id);
    
g_szPlayerName[id][0] = EOS;
}

public 
client_infochanged(id)
{
    if(!
is_user_connected(id))
        return;

    static 
newname[40], oldname[32];
    
get_user_name(idoldnamecharsmax(oldname));
    
get_user_info(id"name"newnamecharsmax(newname));

    if(!
equali(newnameoldname))
    {
        
reset_client(id);
        
g_szPlayerName[id] = newname;
        
escape_mysql(g_szPlayerName[id], charsmax(g_szPlayerName[]));
        
MySQL_Load(id);
    }
}

public 
MySQL_Init()
{
    new 
cvar get_pcvar_num(cvar_stats);
    if(
cvar == 1)
    {
        new 
host[64], user[33], pass[32], db[32];
        
get_cvar_string("amx_sql_host"hostcharsmax(host));
        
get_cvar_string("amx_sql_user"usercharsmax(user));
        
get_cvar_string("amx_sql_pass"passcharsmax(pass));
        
get_cvar_string("amx_sql_db"dbcharsmax(db));
        
g_pSqlTuple SQL_MakeDbTuple(hostuserpassdb);
    }
    else if(
cvar == 2)
    {
        
SQL_SetAffinity("sqlite");
        
g_pSqlTuple SQL_MakeDbTuple("localhost""root""""ttt_stats");

    }
    else 
set_fail_state("[TTT] CVAR set wrongly, plugin turning off!");

    new 
error[128];
    new 
codeHandle:connection SQL_Connect(g_pSqlTuplecodeerrorcharsmax(error));
    if(
connection == Empty_Handle)
        
set_fail_state(error);

    new 
Handle:queries;
    if(
cvar == 1)
    {
        
queries SQL_PrepareQuery(connection
            
"CREATE TABLE IF NOT EXISTS ttt_stats(\
                id int unsigned NOT NULL AUTO_INCREMENT, \
                player_name varchar(40) UNIQUE NOT NULL default '', \
                gwk int(10), \
                kills_i int(10), \
                kills_d int(10), \
                kills_t int(10), \
                rdm int(10), \
                innocent int(15), \
                detective int(10), \
                traitor int(10), \
                bomb_planted int(10), \
                bomb_exploded int(10), \
                bomb_defused int(10), \
                total_points int(32), \
                PRIMARY KEY (id)\
            );"
        
);
    }
    else if(
cvar == 2)
    {
        
queries SQL_PrepareQuery(connection
            
"CREATE TABLE IF NOT EXISTS ttt_stats(\
                id INTEGER PRIMARY KEY, \
                player_name CHAR(40) UNIQUE NOT NULL default '', \
                gwk INTEGER, \
                kills_i INTEGER, \
                kills_d INTEGER, \
                kills_t INTEGER, \
                rdm INTEGER, \
                innocent INTEGER, \
                detective INTEGER, \
                traitor INTEGER, \
                bomb_planted INTEGER, \
                bomb_exploded INTEGER, \
                bomb_defused INTEGER, \
                total_points INTEGER\
            );"
        
);
    }

    if(!
SQL_Execute(queries))
    {
        
SQL_QueryError(querieserrorcharsmax(error));
        
set_fail_state(error);
    }

    
SQL_FreeHandle(queries);
    
SQL_FreeHandle(connection); 
}

public 
MySQL_Load(id)
{
    new 
data[2];
    
data[0] = id;

    static 
temp[96];
    
format(tempcharsmax(temp), "SELECT * FROM ttt_stats WHERE player_name = ^"%s^""g_szPlayerName[id]);
    
SQL_ThreadQuery(g_pSqlTuple"MySQL_LoadData"tempdata1);
}

public 
MySQL_Save(id)
{
    if(!
g_szPlayerName[id][0])
        return;

    
count_points(id);
    static 
temp[512];
    
format(tempcharsmax(temp), "UPDATE ttt_stats SET gwk = '%d', kills_i = '%d', kills_d = '%d', kills_t = '%d', rdm = '%d', innocent = '%d', detective = '%d', traitor = '%d', bomb_planted = '%d', bomb_exploded = '%d', bomb_defused = '%d', total_points = '%d' WHERE player_name = ^"%s^"",
    
g_iPlayerStats[id][STATS_GWK], g_iPlayerStats[id][STATS_KILLS_I], g_iPlayerStats[id][STATS_KILLS_D], g_iPlayerStats[id][STATS_KILLS_T], g_iPlayerStats[id][STATS_RDM], g_iPlayerStats[id][STATS_INN], g_iPlayerStats[id][STATS_DET], g_iPlayerStats[id][STATS_TRA], g_iPlayerStats[id][STATS_BOMBP], g_iPlayerStats[id][STATS_BOMBE], g_iPlayerStats[id][STATS_BOMBD], g_iPlayerStats[id][STATS_POINTS], g_szPlayerName[id]);

    
SQL_ThreadQuery(g_pSqlTuple"MySQL_FreeHandle"temp);
}

public 
MySQL_LoadData(failstateHandle:queryerror[], codedata[], datasize)
{
    if(
failstate == TQUERY_CONNECT_FAILED)
        
log_amx("[TTT] Load - Could not connect to SQL database.  [%d] %s"codeerror);
    else if(
failstate == TQUERY_QUERY_FAILED)
        
log_amx("[TTT] Load query failed. [%d] %s"codeerror);

    new 
id data[0];
    if(!
is_user_connected(id))
    {
        
SQL_FreeHandle(query);
        return 
PLUGIN_HANDLED;
    }

    if(
SQL_NumResults(query) > 0
    {
        for(new 
0PLAYER_STATSi++)
            
g_iPlayerStats[id][i] = SQL_ReadResult(queryi+2);
    }
    else 
table_insert(id);
    
SQL_FreeHandle(query);

    return 
PLUGIN_HANDLED;
}

public 
MySQL_FreeHandle(failstateHandle:queryerror[], errcodedata[], datasize)
{
    
SQL_FreeHandle(query);
    return 
PLUGIN_HANDLED;
}

public 
MySQL_TOP10()
{
    
SQL_ThreadQuery(g_pSqlTuple"MySQL_TOP10Load""SELECT * FROM ttt_stats ORDER BY total_points DESC LIMIT 10");
}

public 
MySQL_TOP10Load(failstateHandle:queryerror[], errcodedata[], datasize)
{
    if(
failstate == TQUERY_CONNECT_FAILED)
        
log_amx("[TTT] Load - Could not connect to SQL database.  [%d] %s"errcodeerror);
    else if(
failstate == TQUERY_QUERY_FAILED)
        
log_amx("[TTT] Load query failed. [%d] %s"errcodeerror);

    new 
result SQL_NumResults(query);
    if(
result
    {
        for(new 
num[3], j0resulti++)
        {
            static 
name[32];
            
SQL_ReadResult(query1namecharsmax(name));
            
#if AMXX_VERSION_NUM >= 183
            
TrieSetString(g_tTop10Players[i], "1"nametrue);
            
#else
            
TrieSetString(g_tTop10Players[i], "1"name);
            
#endif
            
            
for(214j++)
            {
                
num_to_str(jnumcharsmax(num));
                
#if AMXX_VERSION_NUM >= 183
                
TrieSetCell(g_tTop10Players[i], numSQL_ReadResult(queryj), true);
                
#else
                
TrieSetCell(g_tTop10Players[i], numSQL_ReadResult(queryj));
                
#endif
            
}
            
SQL_NextRow(query);
        }
    }
    
SQL_FreeHandle(query);

    return 
PLUGIN_HANDLED;
}

public 
show_top10(id)
{
    const 
SIZE 1536;
    static 
msg[SIZE+1], motdname[64], cached;
    if(!
cached)
    {
        new 
len;
        
len += formatex(msg[len], SIZE len"<html><head><style>table,td,th { border:1px solid black; border-collapse:collapse; }</style></head><body bgcolor='#ebf3f8'><table style='width:748px'>");
        
len += formatex(msg[len], SIZE len"<th>Nr.</th><th>Name</th><th>Points</th><th>GWK</th><th>Kills as I</th><th>Kills as D</th><th>Kills as T</th><th>Team kills</th>");
        
        static 
name[32], value;
        for(new 
010i++)
        {
            
len += formatex(msg[len], SIZE len"<tr>");
            
len += formatex(msg[len], SIZE len"<td>%d.</td>"i+1);

            
TrieGetString(g_tTop10Players[i], "1"namecharsmax(name));
            
len += formatex(msg[len], SIZE len"<td>%s</td>"name);

            
TrieGetCell(g_tTop10Players[i], "13"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);

            
TrieGetCell(g_tTop10Players[i], "2"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);
            
TrieGetCell(g_tTop10Players[i], "3"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);
            
TrieGetCell(g_tTop10Players[i], "4"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);
            
TrieGetCell(g_tTop10Players[i], "5"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);
            
TrieGetCell(g_tTop10Players[i], "6"value);
            
len += formatex(msg[len], SIZE len"<td>%d</td>"value);

            
len += formatex(msg[len], SIZE len"</tr>");
        }
        
len += formatex(msg[len], SIZE len"</table></body></html>");
        
formatex(motdnamecharsmax(motdname), "Stats");
        
cached true;
    }
    
show_motd(idmsgmotdname);
}

public 
show_stats(id)
{
    if(
is_user_alive(id) && ttt_get_gamemode() == GAME_STARTED)
    {
        
client_print_color(idprint_team_default"%s %L"TTT_TAGid"TTT_ALIVE");
        return;
    }

    
count_points(id);
    const 
SIZE 1536;
    static 
msg[SIZE+1], motdname[64];

    new 
len;
    
len += formatex(msg[len], SIZE len"<html><head><style>table,td,th { border:1px solid black; border-collapse:collapse; }</style></head><body bgcolor='#ebf3f8'><table style='width:748px'>");
    
len += formatex(msg[len], SIZE len"<th>Name</th><th>Points</th><th>GWK</th><th>Kills as I</th><th>Kills as D</th><th>Kills as T</th><th>Team kills</th>");

    
len += formatex(msg[len], SIZE len"<tr><td>%s</td>"g_szPlayerName[id]);
    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_POINTS]);

    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_GWK]);
    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_KILLS_I]);
    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_KILLS_D]);
    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_KILLS_T]);
    
len += formatex(msg[len], SIZE len"<td>%d</td>"g_iPlayerStats[id][STATS_RDM]);
    
len += formatex(msg[len], SIZE len"</tr></table></body></html>");
    
formatex(motdnamecharsmax(motdname), "Stats");

    
show_motd(idmsgmotdname);
}

stock reset_client(id)
{
    for(new 
0PLAYER_STATSi++)
        
g_iPlayerStats[id][i] = 0;
}

stock count_points(id)
{
    new 
points;
    for(new 
0PLAYER_STATS-1i++)
        
points += (g_iPlayerStats[id][i] * g_iPointValue[i]);

    
g_iPlayerStats[id][STATS_POINTS] = points;
}

stock table_insert(id)
{
    static 
temp[512];
    
format(tempcharsmax(temp), "INSERT INTO ttt_stats (player_name, gwk, kills_i, kills_d, kills_t, rdm, innocent, detective, traitor, bomb_planted, bomb_exploded, bomb_defused, total_points) VALUES (^"%s^", '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
    
g_szPlayerName[id], g_iPlayerStats[id][STATS_GWK], g_iPlayerStats[id][STATS_KILLS_I], g_iPlayerStats[id][STATS_KILLS_D], g_iPlayerStats[id][STATS_KILLS_T], g_iPlayerStats[id][STATS_RDM], g_iPlayerStats[id][STATS_INN], g_iPlayerStats[id][STATS_DET], g_iPlayerStats[id][STATS_TRA], g_iPlayerStats[id][STATS_BOMBP], g_iPlayerStats[id][STATS_BOMBE], g_iPlayerStats[id][STATS_BOMBD], g_iPlayerStats[id][STATS_POINTS]);
    
SQL_ThreadQuery(g_pSqlTuple"MySQL_FreeHandle"temp);
}

// API
public _set_stats(pluginparams)
{
    if(
params != 3)
        return 
ttt_log_api_error("ttt_set_stats needs 3 params(p1: %d, p2: %d, p3: %d)"pluginparamsget_param(1), get_param(2), get_param(3));

    
g_iPlayerStats[get_param(1)][get_param(2)] = get_param(3);
    return 
1;
}

public 
_get_stats(pluginparams)
{
    if(
params != 2)
        return 
ttt_log_api_error("ttt_get_stats needs 2 params(p1: %d, p2: %d)"pluginparamsget_param(1), get_param(2));

    return 
g_iPlayerStats[get_param(1)][get_param(2)];
}

// DIFFERENT STATS:
public ttt_gamemode(gamemode)
{
    if(
gamemode == GAME_STARTED)
    {
        new 
numid;
        static 
players[32];
        
get_players(playersnum);
        for(--
numnum >= 0num--)
        {
            
id players[num];
            switch(
ttt_get_playerstate(id))
            {
                case 
PC_INNOCENTg_iPlayerStats[id][STATS_INN] = g_iPlayerStats[id][STATS_INN] + 1;
                case 
PC_TRAITORg_iPlayerStats[id][STATS_TRA] = g_iPlayerStats[id][STATS_TRA] + 1;
                case 
PC_DETECTIVEg_iPlayerStats[id][STATS_DET] = g_iPlayerStats[id][STATS_DET] + 1;
            }
        }
    }
}

public 
ttt_bomb_status(idstatusent)
{
    switch(
status)
    {
        case 
BS_DEFUSEDg_iPlayerStats[id][STATS_BOMBD] = g_iPlayerStats[id][STATS_BOMBD] + 1;
        case 
BS_PLANTEDg_iPlayerStats[id][STATS_BOMBP] = g_iPlayerStats[id][STATS_BOMBP] + 1;
        case 
BS_BOMBEDg_iPlayerStats[id][STATS_BOMBE] = g_iPlayerStats[id][STATS_BOMBE] + 1;
    }
}

public 
Ham_Killed_post(victimkillershouldgib)
{
    if(!
is_user_connected(killer))
        
killer ttt_find_valid_killer(victimkiller);

    if(
is_user_connected(killer) && victim != killer)
    {
        new 
killer_state ttt_get_alivestate(killer), victim_state ttt_get_alivestate(victim);

        switch(
killer_state)
        {
            case 
PC_TRAITOR:
            {
                switch(
victim_state)
                {
                    case 
PC_TRAITORg_iPlayerStats[killer][STATS_RDM] = g_iPlayerStats[killer][STATS_RDM] + 1;
                    case 
PC_INNOCENTPC_DETECTIVEg_iPlayerStats[killer][STATS_KILLS_T] = g_iPlayerStats[killer][STATS_KILLS_T] + 1;
                }
            }
            case 
PC_INNOCENT:
            {
                switch(
victim_state)
                {
                    case 
PC_TRAITORg_iPlayerStats[killer][STATS_KILLS_I] = g_iPlayerStats[killer][STATS_KILLS_I] + 1;
                    case 
PC_INNOCENTPC_DETECTIVEg_iPlayerStats[killer][STATS_RDM] = g_iPlayerStats[killer][STATS_RDM] + 1;
                }
            }
            case 
PC_DETECTIVE:
            {
                switch(
victim_state)
                {
                    case 
PC_TRAITORg_iPlayerStats[killer][STATS_KILLS_D] = g_iPlayerStats[killer][STATS_KILLS_D] + 1;
                    case 
PC_INNOCENTPC_DETECTIVEg_iPlayerStats[killer][STATS_RDM] = g_iPlayerStats[killer][STATS_RDM] + 1;
                }
            }
        }
    }

Responder
#2
Tienes activado el modulo?
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#3
(18/06/2016, 01:20 PM)kikizon2 escribió: Tienes activado el modulo?

Si, los datos los guarda, pero aveces cuando me expulsa el servidor por matar mal me los elimina, mayormente cuando cambia de mapa, tendría que colocar algo en el client_disconnect en el core quizás? creo que utiliza un task para guardar los datos el stats
Responder
#4
Prueba este con guardado adv_vault Nothingdohere
TTT_Stats en adv_vault
Mis Aportes:

[ TTT ] Item: Target Gun

[ TTT ] Item: Skeleton Gun (New)
[ TTT ] Item: Pipe Bomb
[ TTT ] Item: Inverse Golden
[Imagen: 76561198074954930.png] [Imagen: venezuela.gif]
Pregúntate si lo que estás haciendo hoy te acerca a el lugar en el que quieres estar mañana. Corazón
Responder
#5
Me tiró este error,
L 06/19/2016 - 02:15:18: replace() buffer not big enough (3>=2)
L 06/19/2016 - 02:15:18: [AMXX] Run time error 10 (plugin "ttt_stats_system.amxx") (native "replace") - debug not enabled!
Responder
#6
Pone en plugins.ini o el que uses

ttt_stats_system.amxx debug

Y mostra los logs, ahi te va a decir bien el error.
TFD ------ 10% (proyecto parado)

[Imagen: 76561198053053139.png]
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)