08/04/2019, 10:47 PM
Buenas noches, ya había hecho un thread sobre esto, pero me surgen varias dudas. ¿Es correcto hacer esto?, ¿Qué pros y contras tendría?, ¿Afectaría en algo al servidor o en los datos de los usuarios? Gracias...
Al comenzar el mapa, cargo todas los datos de todos los usuarios y las almaceno en una Trie de esta manera.
Después, cuando un usuario se conecta al servidor, le cargo los datos que están almacendos en la Trie de esta manera.
Y al desconectarse los almaceno nuevamente en la Trie y en la base de datos de esta manera.
Al comenzar el mapa, cargo todas los datos de todos los usuarios y las almaceno en una Trie de esta manera.
Código PHP:
new Trie:g_trie_user_stats;
public plugin_init()
{
set_task(0.5, "update_accounts");
}
public plugin_end()
{
TrieDestroy(g_trie_user_stats);
}
public update_accounts()
{
new Handle:query;
query = SQL_PrepareQuery(g_sql_connection, "SELECT * FROM %s;", SQL_TABLE);
if (!SQL_Execute(query))
sql_query_error(query);
else if (SQL_NumResults(query))
{
static trie_stats[TRIE_STATS_STRUCT];
while (SQL_MoreResults(query))
{
trie_stats[TRIE_STAT_ID] = SQL_ReadResult(query, 0);
SQL_ReadResult(query, 1, trie_stats[TRIE_STAT_NAME], 31);
SQL_ReadResult(query, 2, trie_stats[TRIE_STAT_PASSWORD], 31);
SQL_ReadResult(query, 3, trie_stats[TRIE_STAT_IP], 16);
SQL_ReadResult(query, 4, trie_stats[TRIE_STAT_DATE_REGISTER], 31);
SQL_ReadResult(query, 5, trie_stats[TRIE_STAT_LAST_DATE], 31);
trie_stats[TRIE_STAT_LEVEL] = SQL_ReadResult(query, 13);
trie_stats[TRIE_STAT_EXPERIENCE] = SQL_ReadResult(query, 14);
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL] = SQL_ReadResult(query, 15);
trie_stats[TRIE_STAT_AMMOPACKS] = SQL_ReadResult(query, 16);
trie_stats[TRIE_STAT_SYSTIME_SECONDS] = SQL_ReadResult(query, 17);
SQL_ReadResult(query, 18, trie_stats[TRIE_STAT_HABS], charsmax(trie_stats[TRIE_STAT_HABS]));
SQL_ReadResult(query, 19, trie_stats[TRIE_STAT_COLORS], charsmax(trie_stats[TRIE_STAT_COLORS]));
SQL_ReadResult(query, 20, trie_stats[TRIE_STAT_STATS], charsmax(trie_stats[TRIE_STAT_STATS]));
SQL_ReadResult(query, 21, trie_stats[TRIE_STAT_ITEMS], charsmax(trie_stats[TRIE_STAT_ITEMS]));
SQL_ReadResult(query, 22, trie_stats[TRIE_STAT_WEAPONS], charsmax(trie_stats[TRIE_STAT_WEAPONS]));
SQL_ReadResult(query, 23, trie_stats[TRIE_STAT_LAST_ACHIEVEMENT], charsmax(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT]));
trie_stats[TRIE_STAT_MULTI] = SQL_ReadResult(query, 24);
TrieSetArray(g_trie_user_stats, trie_stats[TRIE_STAT_NAME], trie_stats, sizeof(trie_stats));
SQL_NextRow(query);
}
SQL_FreeHandle(query);
}
else
SQL_FreeHandle(query);
}
Después, cuando un usuario se conecta al servidor, le cargo los datos que están almacendos en la Trie de esta manera.
Código PHP:
public client_putinserver(id)
{
set_task(0.2, "zp_check_account", id);
}
public zp_check_account(id)
{
static trie_stats[TRIE_STATS_STRUCT];
if (TrieGetArray(g_trie_user_stats, g_user_name[id], trie_stats, sizeof(trie_stats)))
{
if (!equal(g_user_ip[id], trie_stats[TRIE_STAT_IP]))
{
query_account(id);
return;
}
g_load_trie[id] = 1;
g_user_auto_logged[id] = 1;
g_user_register[id] = 1;
copy(g_user_date_register[id], 31, trie_stats[TRIE_STAT_DATE_REGISTER]);
copy(g_user_last_date[id], 31, trie_stats[TRIE_STAT_LAST_DATE]);
copy(g_user_password[id], charsmax(g_user_password[]), trie_stats[TRIE_STAT_PASSWORD]);
g_user_id[id] = trie_stats[TRIE_STAT_ID];
load_data_user
(
id,
trie_stats[TRIE_STAT_LEVEL],
trie_stats[TRIE_STAT_EXPERIENCE],
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL],
trie_stats[TRIE_STAT_AMMOPACKS],
trie_stats[TRIE_STAT_SYSTIME_SECONDS],
trie_stats[TRIE_STAT_HABS],
trie_stats[TRIE_STAT_COLORS],
trie_stats[TRIE_STAT_STATS],
trie_stats[TRIE_STAT_ITEMS],
trie_stats[TRIE_STAT_WEAPONS],
trie_stats[TRIE_STAT_LAST_ACHIEVEMENT],
trie_stats[TRIE_STAT_MULTI]
);
clcmd_changeteam(id);
return;
}
query_account(id);
client_print(id, print_center, "Los datos de tu cuenta están siendo cargados...");
}
Y al desconectarse los almaceno nuevamente en la Trie y en la base de datos de esta manera.
Código PHP:
public client_disconnect(id)
save_data(id);
save_data(id)
{
*** CONSULTA AL SQL ***
format(sztext, charsmax(sztext), "UPDATE `%s` SET ..... WHERE ...");
SQL_TheadQuery(Handle:Tupla, "MyFunction", Handle:MyQuery, myData);
trie_stats[TRIE_STAT_ID] = g_user_id[id];
copy(trie_stats[TRIE_STAT_NAME], charsmax(trie_stats[TRIE_STAT_NAME]), g_user_name[id]);
copy(trie_stats[TRIE_STAT_PASSWORD], charsmax(trie_stats[TRIE_STAT_PASSWORD]), g_user_password[id]);
copy(trie_stats[TRIE_STAT_DATE_REGISTER], charsmax(trie_stats[TRIE_STAT_DATE_REGISTER]), g_user_date_register[id]);
copy(trie_stats[TRIE_STAT_LAST_DATE], charsmax(trie_stats[TRIE_STAT_LAST_DATE]), g_user_last_date[id]);
trie_stats[TRIE_STAT_LEVEL] = g_user[id][USER_LEVEL];
trie_stats[TRIE_STAT_EXPERIENCE] = g_user[id][USER_EXPERIENCE];
trie_stats[TRIE_STAT_EXPERIENCE_TOTAL] = g_user[id][USER_EXPERIENCE_TOTAL];
trie_stats[TRIE_STAT_AMMOPACKS] = g_user[id][USER_AMMOPACKS];
trie_stats[TRIE_STAT_SYSTIME_SECONDS] = g_user[id][USER_SYSTIME_SECONDS];
copy(trie_stats[TRIE_STAT_HABS], charsmax(trie_stats[TRIE_STAT_HABS]), habs);
copy(trie_stats[TRIE_STAT_COLORS], charsmax(trie_stats[TRIE_STAT_COLORS]), colors);
copy(trie_stats[TRIE_STAT_STATS], charsmax(trie_stats[TRIE_STAT_STATS]), stats);
copy(trie_stats[TRIE_STAT_ITEMS], charsmax(trie_stats[TRIE_STAT_ITEMS]), items);
copy(trie_stats[TRIE_STAT_WEAPONS], charsmax(trie_stats[TRIE_STAT_WEAPONS]), weapons);
copy(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT], charsmax(trie_stats[TRIE_STAT_LAST_ACHIEVEMENT]), g_last_achievement[id]);
copy(trie_stats[TRIE_STAT_IP], charsmax(trie_stats[TRIE_STAT_IP]), g_user_ip[id]);
trie_stats[TRIE_STAT_MULTI] = g_multi[id];
TrieSetArray(g_trie_user_stats, trie_stats[TRIE_STAT_NAME], trie_stats, sizeof(trie_stats));
}
Mute Menú (Chat y Micrófono)
HNS Fragsmod
Deathrun Mod
Misiones
SQL Columns
[GUÍA] Hacer un sistema de cuentas SQLite
Sistema de Ban (SQLite3) [Actualizado]
Zombie Plague (NIVELES)
Mix Ultimate
Mi steam: https://steamcommunity.com/profiles/76561198447190440/
Doy soporte a través de MP.
HNS Fragsmod
Deathrun Mod
Misiones
SQL Columns
[GUÍA] Hacer un sistema de cuentas SQLite
Sistema de Ban (SQLite3) [Actualizado]
Zombie Plague (NIVELES)
Mix Ultimate
Mi steam: https://steamcommunity.com/profiles/76561198447190440/
Doy soporte a través de MP.