y_ini datos bugs
#1

Hola, alguien sabe por quй puede ser que se mezclen los datos de los jugadores?

Explico un poco lo que pasa, entra alguien se registra consigue un trabajo se desconecta y despuйs
entra otra persona, se registra y obtiene el trabajo que tenia el jugador anterior, no solo el trabajo es con casi todos los datos a excepciуn de la contraseсa.

No pongo un cуdigo por que es muy largo el registro y guardado de datos, pero si a alguien alguna vez le paso y sabe porque podrнa ser que pase, si pueden comentar las posibles cosas que podrнan causar este error me ayudarнan mucho.

Antes usaba dini y no pasaba esto, ahora que cambie el guardado de datos a ini apareciу este bug.
Reply
#2

tienes que setear todas esas variables al valor por defecto cuando un jugador se desconecte..
Reply
#3

Resetea las variables cuando uno se conecte o desconecte.

http://www.mediafire.com/view/bpg125...gin_system.pwn
Reply
#4

Hola, gracias por responder. Cuando se desconecta un jugador actualizo las variables asн:

pawn Код:
#define DATOS     "Usuarios/%s.ini"

public OnPlayerDisconnect(playerid, reason)
{
GuardarDatos(playerid);
return 1;
}

forward GuardarDatos(playerid);
public GuardarDatos(playerid)
{
    new Nombre[MAX_PLAYER_NAME], Archivo[13+MAX_PLAYER_NAME+1], Float:Pos[4], Float:VidaChaleco[2];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    GetPlayerFacingAngle(playerid, Pos[3]);
    GetPlayerHealth(playerid, VidaChaleco[0]);
    GetPlayerArmour(playerid, VidaChaleco[1]);
    GetPlayerName(playerid, Nombre, sizeof(Nombre));
    if(INI_Exist(Nombre))
    {
        format(Archivo ,sizeof Archivo, DATOS, Nombre);
        new INI:File = INI_Open(Archivo);
        INI_SetTag(File,"datos");
        INI_WriteInt(File,"Admin",Datos[playerid][pAdmin]);
        INI_WriteInt(File,"Dinero",Datos[playerid][pDinero]);
        INI_WriteInt(File,"Edad",Datos[playerid][pEdad]);
        INI_WriteFloat(File,"Pos_x",Pos[0]);
        INI_WriteFloat(File,"Pos_y",Pos[1]);
        INI_WriteFloat(File,"Pos_z",Pos[2]);
        INI_WriteFloat(File,"Pos_a",Pos[3]);
        INI_WriteFloat(File,"Vida",Float:VidaChaleco[0]);
        INI_WriteFloat(File,"Chaleco",Float:VidaChaleco[1]);
        INI_Close(File);
    }
return 1;
}
Esos son algunos datos para mostrarles como lo guardo, pero son muchos mбs datos los que guardo.

PD: cuando un jugador crashea o pierde la conexiуn de internet no pasa por OnPlayerDisconnect no serб por eso el bug?
Reply
#5

Ahн no estбs actualizando ninguna variable, ahн estбs guardando la informaciуn en el archivo. Es que no actualizas las variables al valor "default" que debe tener cuando un nuevo jugador se conecta.

Cuando alguien se desconecta las variables del ese playerid quedan con la misma informaciуn y cuando alguien mбs se conecte con el mismo ID tendrб los mismos datos. Debes actualizar las variables al valor que quieres que tenga un jugador cuando entre nuevo Ej:

pawn Код:
public OnPlayerConnect(playerid)
{
    //jugador nuevo nivel 0 admin
    Datos[playerid][pAdmin] = 0;
    //demбs variables a 0, false o valor inicial
    //si la cuenta existe hace login y le da el nivel que estй en el archivo y sino, se registra con nivel 0
    return 1;
}
Reply
#6

Gracias por responder creo que ya no se bugea, pero igual voy a seguir viendo si quedo bien, cualquier cosa voy a tener que revivir el tema, pero espero que no tenga que hacerlo
Reply
#7

Hola, tuve que revivir el tema paresia que ya andaba por que no se bugeaban las cuentas pero hoy se empezу a bugear de nuevo, les dejo que hice haber si saben por que pasa, agregue que se reseteen las variables como dijeron al conectarse o desconectarse, anduvo por un dнa pero ahora se empezу a bugear como antes.

pawn Код:
public OnPlayerConnect(playerid)
{
       ResetVariables(playerid);
       new Nombre[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Nombre, MAX_PLAYER_NAME);
    if(INI_Exist(Nombre))
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_pass", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid, DIALOGO_INGRESO, DIALOG_STYLE_PASSWORD, "INGRESO", "Ingrese su contraseсa para ingresar al servidor.", "Aceptar", "Salir");
        return 1;
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOGO_REGISTRO, DIALOG_STYLE_PASSWORD, "REGISTRO", "Bienvenido al servidor, ingrese una contraseсa para registrarte.", "Registrarse", "Salir");
        return 1;
    }
return 1;
}
pawn Код:
public OnPlayerSpawn(playerid)
{
JugadorLogeado[playerid] = 1;
return 1;
}
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
GuardarDatos(playerid);
JugadorLogeado[playerid] = 0;
return 1;
}
pawn Код:
forward GuardarDatos(playerid);
public GuardarDatos(playerid)
{
if(JugadorLogeado[playerid] == 1)
{
    new Nombre[MAX_PLAYER_NAME], Archivo[13+MAX_PLAYER_NAME+1], Float:Pos[4], Float:VidaChaleco[2];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    GetPlayerFacingAngle(playerid, Pos[3]);
    GetPlayerHealth(playerid, VidaChaleco[0]);
    GetPlayerArmour(playerid, VidaChaleco[1]);
    GetPlayerName(playerid, Nombre, sizeof(Nombre));
    if(INI_Exist(Nombre))
    {
        format(Archivo ,sizeof Archivo, DATOS, Nombre);
        new INI:File = INI_Open(Archivo);
        INI_SetTag(File,"datos");
        INI_WriteInt(File,"Admin",Datos[playerid][pAdmin]);
        INI_WriteInt(File,"Dinero",Datos[playerid][pDinero]);
        INI_WriteInt(File,"Edad",Datos[playerid][pEdad]);
        INI_WriteFloat(File,"Pos_x",Pos[0]);
        INI_WriteFloat(File,"Pos_y",Pos[1]);
        INI_WriteFloat(File,"Pos_z",Pos[2]);
        INI_WriteFloat(File,"Pos_a",Pos[3]);
        INI_WriteFloat(File,"Vida",Float:VidaChaleco[0]);
        INI_WriteFloat(File,"Chaleco",Float:VidaChaleco[1]);
        INI_Close(File);
    }
}
return 1;
}
pawn Код:
stock ResetVariables(playerid)
{
        Datos[playerid][pAdmin] = 0;
        Datos[playerid][pDinero] = 0;
    Datos[playerid][pEdad] = 0;
        Datos[playerid][pPos_x] = 0.0;
        Datos[playerid][pPos_y] = 0.0;
        Datos[playerid][pPos_z] = 0.0;
        Datos[playerid][pPos_a] = 0.0;
        Datos[playerid][pVida] = 0.0;
        Datos[playerid][pChaleco] = 0.0;
return 1;
}
PD: tambiйn probй poner ResetVariables en OnPlayerDisconnect pero igual se bugea.

Si cambio a otro guardado de datos como sqlite tambiйn deberнa poner que se reinicien las variables?
Pregunto porque cuando usaba dini no tenia reinicio de variables y nunca se bugeo, capaz solo y_ini necesita eso y si cambio a sqlite capaz ya no se bugea, aunque nunca encontrй tutoriales en espaсol de sqlite, pero si no hay de otra voy a tener que intentar aprender a usarlo o volver a dini xd
Reply
#8

En GuardarDatos no es necesario que se verifique si el jugador estб logueado? de ser asн tendrнas un gran problema ahн.

Si tienes un servidor que haga andar bien el SQL lo mejor es eso, en cualquier caso
Reply
#9

Quote:
Originally Posted by _Zume
Посмотреть сообщение
En GuardarDatos no es necesario que se verifique si el jugador estб logueado? de ser asн tendrнas un gran problema ahн.

Si tienes un servidor que haga andar bien el SQL lo mejor es eso, en cualquier caso
Hola, si verifica si esta logeado, pero no sй porque no lo puse en el tema.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)