Portal SAMP
[Ajuda] Problema de salvamento DOF2 - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Problema de salvamento DOF2 (/showthread.php?tid=5139)



Problema de salvamento DOF2 - zGu1Zin_ - 06/11/2025

não tá salvando o dinheiro skin e score o que faco

Código:
enum pInfo
{
 Dinheiro,
 Skin,
 Score
};

new Player[MAX_PLAYERS][pInfo];

public OnPlayerRequestClass(playerid, classid)
{
 if(DOF2_FileExists(Arquivo(playerid)))
 {
    ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", "Digite Sua Senha Para Logar No Servido", "Logar", "Sair");
 }
 if(!DOF2_FileExists(Arquivo(playerid)))
 {
    ShowPlayerDialog(playerid, Registro, DIALOG_STYLE_INPUT, "Registro", "Digite Uma Senha Para Registrar Sua Conta No Servido", "Registrar", "Sair");
 }
 return 1;
}

public OnPlayerUpdate(playerid)
{
    update(playerid);
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
 if(dialogid == Registro)
 {
    if(response)
    {
    if(strlen(inputtext) < 5 || strlen(inputtext) > 10) return SendClientMessage(playerid, -1, "{FF0000}Sua Senha Deve Ter 5 Entre 10 Letras Ou Numeros"), ShowPlayerDialog(playerid, Registro, DIALOG_STYLE_INPUT, "Registro", "Digite Uma Senha Para Registrar Sua Conta No Servido", "Registrar", "Sair");
    DOF2_CreateFile(Arquivo(playerid));
    DOF2_SetString(Arquivo(playerid), "Senha", inputtext);
    DOF2_SetInt(Arquivo(playerid), "Dinheiro", 5000);
    DOF2_SetInt(Arquivo(playerid), "Skin", 0);
    DOF2_SetInt(Arquivo(playerid), "Score", 0);
    DOF2_SaveFile();
    ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", "Digite Sua Senha Para Logar No Servido", "Logar", "Sair");
    }
    else
    {
    Kick(playerid);
    }
    return 1;
 }
 if(dialogid == Login)
 {
    if(response)
    {
    if(strcmp(inputtext, DOF2_GetString(Arquivo(playerid), "Senha")) == 0)
    {
    SetSpawnInfo(playerid, 0, Player[playerid][Skin], 1154.1945,-1767.0381,16.5938,1.2957,0,0,0,0,0,0);
             CarregarContas(playerid);
    SpawnPlayer(playerid);
    }
    else
    {
    SendClientMessage(playerid, -1, "{FF0000}Sua Senha Esta Incorreta");
       ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", "Digite Sua Senha Para Logar No Servido", "Logar", "Sair");
    }
    }
    else
    {
    Kick(playerid);
    }
    return 1;
 }
 return 1;
}

stock pName(playerid)
{
 new Name [MAX_PLAYER_NAME];
 GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
 return Name;
}

stock Arquivo(playerid)
{
 new str[120];
 format(str, 120, "Contas/%s.ini", pName(playerid));
 return str;
}

stock CarregarContas(playerid)
{
 Player[playerid][Dinheiro] = DOF2_GetInt(Arquivo(playerid), "Dinheiro");
 Player[playerid][Skin] = DOF2_GetInt(Arquivo(playerid), "Skin");
 Player[playerid][Score] = DOF2_GetInt(Arquivo(playerid), "Score");
 return 1;
}

stock update(playerid)
{
 DOF2_SetInt(Arquivo(playerid), "Dinheiro", GetPlayerMoney(playerid));
 DOF2_SetInt(Arquivo(playerid), "Skin", GetPlayerSkin(playerid));
 DOF2_SetInt(Arquivo(playerid), "score", GetPlayerScore(playerid));
 DOF2_SaveFile();
 return 1;
}



RE: Problema de salvamento DOF2 - xbruno1000x - 07/11/2025

Seu sistema de salvamento está quase certo, o problema é o momento em que está salvando. Não se salva usando OnPlayerUpdate, pois essa callback é chamada milhares de vezes por minuto e prejudica o desempenho do seu gamemode. Coloque o salvamento na OnPlayerDisconnect, você só precisa salvar quando o jogador sair do servidor.

Além disso, existem outros problemas no seu código.

Problema 1:
Você não verifica se o jogador está logado. O sistema irá salvar informações de quando o player está com tudo zerado por cima de infos corretas, pois ela salva em qualquer circunstancia.

Código:
new bool:logado[MAX_PLAYERS];

//Quando efetuar login
logado[playerid] = true;

//Quando sair do servidor
logado[playerid]  = false;

//Quando quiser verificar se esta logado
if(logado[playerid]){
}

Adicionando uma verifacação de logado como essa já deve resolver seu problema. Mas não recomendo manter o uso de OnPlayerUpdate.

Problema 2:
Inconsistencia no campo score.
Em alguns pontos você verifica por score com letras minusculas, em outros você usa Score.

No update(playerid) você está salvando assim:
Código:
DOF2_SetInt(Arquivo(playerid), "score", GetPlayerScore(playerid));
Mas quando carrega, usa:
Código:
Player[playerid][Score] = DOF2_GetInt(Arquivo(playerid), "Score");

O ideal é normalizar e deixar tudo igual:
Código:
stock update(playerid)
{
    DOF2_SetInt(Arquivo(playerid), "Dinheiro", GetPlayerMoney(playerid));
    DOF2_SetInt(Arquivo(playerid), "Skin", GetPlayerSkin(playerid));
    DOF2_SetInt(Arquivo(playerid), "Score", GetPlayerScore(playerid)); // corrigido
    DOF2_SaveFile();
    return 1;
}