Manera correcta de guardar datos del jugador
#1

Hola quisiera saber cual seria la forma de guardar los datos del jugador para mantenerlos seguros.


Actualmente tengo una funcion para guardar los datos del jugador y esta la tengo en OnGameModeExit y OnPlayerDisconnect, me gustaria saber si deberia guardar los datos del jugador en otro lado... Ej realizar un timer o algo por el estilo.

Mi funcion:
pawn Код:
public GuardarJugadorInfo(playerid)
{
    new Float:X, Float:Y, Float:Z, Float:Angle, Float:Health, Float:Armour;
    GetPlayerPos(playerid, X, Y, Z);
    GetPlayerFacingAngle(playerid, Angle);
    GetPlayerHealth(playerid, Health);
    GetPlayerArmour(playerid, Armour);

    mysql_format(MySQL, Query, sizeof(Query), "UPDATE `usuarios` set Experiencia = '%d', Nivel = '%d', Admin = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', Angulo = '%f', Interior = '%d', Mundo = '%d', Dinero = '%d', Vida = '%f', Armadura = '%f', Conectado = 0 WHERE Nombre = '%e'",
    JugadorInfo[playerid][Experiencia], JugadorInfo[playerid][Nivel], JugadorInfo[playerid][Admin], X, Y, Z, Angle, GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid), GetPlayerMoney(playerid), Health, Armour, NombreJugador(playerid));
    mysql_tquery(MySQL, Query);
    return 1;

}
Utilizo MySQL.
Reply
#2

Con solo tenerlo en onplayerdisconnect lo guardaria unicamente cuando el jugador se desconecte, asi lo utilizo yo...

Ahora, si quieres mas seguridad y que se guarden las cuentas por ejemplo cada 5 minutos, hazlo con un timer que se repita y listo, no afecta en nada..
Reply
#3

Una duda que tengo con los timer es si se ejecuta a X tiempo desde que el jugador esta conectado en el server, o no importa si esta conectado el jugador.

EJ:
Pepito se conecta 14:00 -> Si creo un timer de 5 minutos este deberia ejecutarse 14:05
Juancito se conecto 14:02 -> їEl timer se ejecuta 14:07 o 14:05 ?
Pepita se conecta 15:36 -> їEl timer se ejecuta a los 5 minutos de conectado este jugador, 15:41?

Esta consulta me viene debido a que no me parece muy factible guardar todos los datos de los jugadores a la vez, es decir ejecutar la funcion GuardarJugadorInfo. Si hubieran 500 usuarios conectado cada 5 minutos tendria que mandar 500 consultas de MySQL, quisiera que se tengan intervalos.
Reply
#4

Hacelo sуlo con OnPlayerDisconnect, porque el servidor se cerrarнa con tu permiso, a menos que se caiga, entonces antes de cerrar el servidor desconectas a todos los jugadores.
Otra forma de guardar los datos es en OnPlayerUpdate, pero no estoy del todo seguro, y no se si eso podrнa provocar lag.
Reply
#5

Juance, si se cae el servidor por un crash o algo asi no se guardarian los datos no? O siempre al desconectarse un usuario no importa cual sea la circunstancia se ejecuta OnPlayerDisconnect?
Reply
#6

Yo creo que sн, la funciуn se ejecutarнa igual al jugador caerse, porque en OnPlayerDisconnect estб el "reason" que es para ver como desconectу el jugador.
Reply
#7

Los datos no se te guardan si te crashean el servidor o lo cierras directamente de la consola, pero en cambio si sale el jugador, crashea o es kickeado, todo se guardarб con йxito . Para evitar eso yo harнa lo siguiente:
pawn Код:
for(new i; i<MAX_PLAYERS; i++)
{
OnPlayerDisconnect(i, 0);
}
suerte amigo

Edito: el cуdigo va en OnGameModeExit.
Reply
#8

No creo que funcione bien. El tiempo del cierre del GM es de 1 segundo, y ese proceso tardarнa mбs de un segundo. En detectar todos los jugadores y desconectar. No sй si darнa tiempo.
Reply
#9

Quote:
Originally Posted by Juance
Посмотреть сообщение
Hacelo sуlo con OnPlayerDisconnect, porque el servidor se cerrarнa con tu permiso, a menos que se caiga, entonces antes de cerrar el servidor desconectas a todos los jugadores.
Otra forma de guardar los datos es en OnPlayerUpdate, pero no estoy del todo seguro, y no se si eso podrнa provocar lag.
Aclarando esto. por la cantidad de veces que esta callback se ejecuta por segundo, usarlo para archivos o ya sea bases de datos causarнa un tremendo lag, en absoluto no se recomienda.

La soluciуn a tu problema serнa un temporizador de 5 minutos como dijo Thewin, si el servidor se cayera no se perderнan datos lejanos a 5 minutos.

Quote:
Originally Posted by YazukiAkira
Посмотреть сообщение
Una duda que tengo con los timer es si se ejecuta a X tiempo desde que el jugador esta conectado en el server, o no importa si esta conectado el jugador.

EJ:
Pepito se conecta 14:00 -> Si creo un timer de 5 minutos este deberia ejecutarse 14:05
Juancito se conecto 14:02 -> їEl timer se ejecuta 14:07 o 14:05 ?
Pepita se conecta 15:36 -> їEl timer se ejecuta a los 5 minutos de conectado este jugador, 15:41?

Esta consulta me viene debido a que no me parece muy factible guardar todos los datos de los jugadores a la vez, es decir ejecutar la funcion GuardarJugadorInfo. Si hubieran 500 usuarios conectado cada 5 minutos tendria que mandar 500 consultas de MySQL, quisiera que se tengan intervalos.
El timer se ejecutarб a la misma hora si es un timer global, aunque puedes hacer un timer individual para cada player pero quizб serнa mucho peso
Reply
#10

Zume, de que manera se podria hacer un timer global?
Si se hiciera un timer por usuario causaria mucho lag?


Ya que estaba aprovecho esto, ya que es interesante jaja
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)