Portal SAMP
[Ajuda] Salvar timer do Pay Day - 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] Salvar timer do Pay Day (/showthread.php?tid=4574)



Salvar timer do Pay Day - Cesar157 - 26/02/2024

Bom Dia 
Boa Tarde
Boa noite

Estou quebrando muita cabeça pra tentar salvar o timer do payday, pra quando o player deslogar não perder o progresso
Já tentei de varias formas possíveis aonde onde eu tenho conhecimento
mas sempre terminei com falhas, preciso muito de alguma ajuda para que eu possa, resolver esse problema

Codigo completo abaixo !
Código:
new PlayerText:PaydayPlayerText[MAX_PLAYERS][1];
new PaydayTimer[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
PaydayTimer[playerid] = SetTimerEx("PayDayc", 1000, true, "i", playerid);
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
KillTimer(PaydayTimer[playerid]);
return 1;
}

forward PayDayc(playerid);
public PayDayc(playerid)
{
    if(pDados[playerid][pSegundos] > 0)
{
    format(File, sizeof(File), PASTA_CONTAS, pName(playerid));
pDados[playerid][pSegundos] --;
static str[50];
format(str, 50, "%d:%d", pDados[playerid][pMinutos], pDados[playerid][pSegundos]);
PlayerTextDrawSetString(playerid, PaydayPlayerText[playerid][0], str);
}
    else if(pDados[playerid][pSegundos] == 0)
{
if(pDados[playerid][pMinutos] > 0)
{
pDados[playerid][pMinutos] --;
pDados[playerid][pSegundos] = 59;
}
else if(pDados[playerid][pMinutos] == 0)
{
            RenameFileAccount(File2, File);
SendClientMessage(playerid, -1, "{00FF00}-=-=-=-=-= PayDay -=-=-=-=-=");
SendClientMessage(playerid, -1, "{FFFFFF}Voce recebeu R$:{00FF00}2.556 ");
SendClientMessage(playerid, -1, "{00FF00}-=-=-=-=-= PayDay -=-=-=-=-=");
}
}
return 1;
}



RE: Salvar timer do Pay Day - xbruno1000x - 26/02/2024

O salvamento está saindo como no arquivo? Como você recupera esse dado no momento em que o player loga novamente?


RE: Salvar timer do Pay Day - strelo - 26/02/2024

Olá!Para resolver seu problema, você precisa salvar os dados do temporizador (como minutos e segundos restantes) em algum lugar persistente, como um arquivo ou banco de dados, quando o jogador se desconecta. Quando o jogador reconectar, você deve carregar esses dados e continuar o temporizador de onde parou.

Aqui está uma sugestão de como você pode modificar seu código para incluir essa funcionalidade:


Salvar os dados do temporizador ao desconectar: No evento OnPlayerDisconnect, antes de matar o temporizador, salve os minutos e segundos restantes em um arquivo ou banco de dados.
Carregar os dados do temporizador ao conectar: No evento OnPlayerConnect, carregue os dados salvos (se existirem) e ajuste o temporizador de acordo.

Segue um exemplo de como implementar isso usando arquivos. Você precisará ajustar os nomes das funções de acordo com o resto do seu código, como a função para obter o nome do jogador (pName) e as variáveis para minutos e segundos (pDados[playerid][pMinutos], pDados[playerid][pSegundos]).

Ao Desconectar

Código PHP:
public OnPlayerDisconnect(playeridreason)
{
    // Obtenha o nome do jogador para usar como nome do arquivo
    new playerName[24];
    GetPlayerName(playeridplayerNamesizeof(playerName));
    
    
// Crie um nome de arquivo único para o jogador
    new filename[40];
    format(filenamesizeof(filename), "savedTimers/%s.txt"playerName);
    
    
// Salve os minutos e segundos restantes em um arquivo
    new file:FileHandle fopen(filenameio_write);
    if(FileHandle)
    {
        fprintf(FileHandle"%d %d"pDados[playerid][pMinutos], pDados[playerid][pSegundos]);
        fclose(FileHandle);
    }
    
    
// Mate o temporizador
    KillTimer(PaydayTimer[playerid]);
    return 1;


Ao Conectar

Código PHP:
public OnPlayerConnect(playerid)
{
    // Obtenha o nome do jogador para usar como nome do arquivo
    new playerName[24];
    GetPlayerName(playeridplayerNamesizeof(playerName));
    
    
// Crie um nome de arquivo único para o jogador
    new filename[40];
    format(filenamesizeof(filename), "savedTimers/%s.txt"playerName);
    
    
// Tente abrir o arquivo para carregar os minutos e segundos salvos
    new file:FileHandle fopen(filenameio_read);
    if(FileHandle)
    {
        fscanf(FileHandle"%d %d"pDados[playerid][pMinutos], pDados[playerid][pSegundos]);
        fclose(FileHandle);
        
        
// Opcional: Exclua o arquivo após carregar os dados
        fremove(filename);
        
        
// Recalcule o tempo restante em milissegundos e recrie o temporizador
        // Isso é apenas um exemplo, você precisará ajustar conforme sua lógica de temporização
        new remainingTime = (pDados[playerid][pMinutos] * 60 pDados[playerid][pSegundos]) * 1000;
        PaydayTimer[playerid] = SetTimerEx("PayDayc"remainingTimefalse"i"playerid);
    }
    else
    {
        // Se não houver dados salvos, crie um novo temporizador
        PaydayTimer[playerid] = SetTimerEx("PayDayc"1000true"i"playerid);
    }
    return 1;


Note que você precisará criar uma pasta chamada savedTimers no diretório do seu servidor para armazenar os arquivos. Este código é apenas um exemplo básico para ilustrar como você pode implementar a funcionalidade.


RE: Salvar timer do Pay Day - Cesar157 - 29/02/2024

(26/02/2024 11:49)xbruno1000x Escreveu: O salvamento está saindo como no arquivo? Como você recupera esse dado no momento em que o player loga novamente?
Bom dia 
Sim! eu criei uma enum para salvar os dados do player
E em onplayerconnect, eu criei uma script pra puxar os dados salvo do player, está tudo certinho! O único problema é que o timer não salva o tempo quando o player desloga

(26/02/2024 16:50)strelo Escreveu: Olá!Para resolver seu problema, você precisa salvar os dados do temporizador (como minutos e segundos restantes) em algum lugar persistente, como um arquivo ou banco de dados, quando o jogador se desconecta. Quando o jogador reconectar, você deve carregar esses dados e continuar o temporizador de onde parou.

Aqui está uma sugestão de como você pode modificar seu código para incluir essa funcionalidade:


Salvar os dados do temporizador ao desconectar: No evento OnPlayerDisconnect, antes de matar o temporizador, salve os minutos e segundos restantes em um arquivo ou banco de dados.
Carregar os dados do temporizador ao conectar: No evento OnPlayerConnect, carregue os dados salvos (se existirem) e ajuste o temporizador de acordo.

Segue um exemplo de como implementar isso usando arquivos. Você precisará ajustar os nomes das funções de acordo com o resto do seu código, como a função para obter o nome do jogador (pName) e as variáveis para minutos e segundos (pDados[playerid][pMinutos], pDados[playerid][pSegundos]).

Ao Desconectar

Código PHP:
public OnPlayerDisconnect(playeridreason)
{
    // Obtenha o nome do jogador para usar como nome do arquivo
    new playerName[24];
    GetPlayerName(playeridplayerNamesizeof(playerName));
    
    
// Crie um nome de arquivo único para o jogador
    new filename[40];
    format(filenamesizeof(filename), "savedTimers/%s.txt"playerName);
    
    
// Salve os minutos e segundos restantes em um arquivo
    new file:FileHandle fopen(filenameio_write);
    if(FileHandle)
    {
        fprintf(FileHandle"%d %d"pDados[playerid][pMinutos], pDados[playerid][pSegundos]);
        fclose(FileHandle);
    }
    
    
// Mate o temporizador
    KillTimer(PaydayTimer[playerid]);
    return 1;


Ao Conectar

Código PHP:
public OnPlayerConnect(playerid)
{
    // Obtenha o nome do jogador para usar como nome do arquivo
    new playerName[24];
    GetPlayerName(playeridplayerNamesizeof(playerName));
    
    
// Crie um nome de arquivo único para o jogador
    new filename[40];
    format(filenamesizeof(filename), "savedTimers/%s.txt"playerName);
    
    
// Tente abrir o arquivo para carregar os minutos e segundos salvos
    new file:FileHandle fopen(filenameio_read);
    if(FileHandle)
    {
        fscanf(FileHandle"%d %d"pDados[playerid][pMinutos], pDados[playerid][pSegundos]);
        fclose(FileHandle);
        
        
// Opcional: Exclua o arquivo após carregar os dados
        fremove(filename);
        
        
// Recalcule o tempo restante em milissegundos e recrie o temporizador
        // Isso é apenas um exemplo, você precisará ajustar conforme sua lógica de temporização
        new remainingTime = (pDados[playerid][pMinutos] * 60 pDados[playerid][pSegundos]) * 1000;
        PaydayTimer[playerid] = SetTimerEx("PayDayc"remainingTimefalse"i"playerid);
    }
    else
    {
        // Se não houver dados salvos, crie um novo temporizador
        PaydayTimer[playerid] = SetTimerEx("PayDayc"1000true"i"playerid);
    }
    return 1;


Note que você precisará criar uma pasta chamada savedTimers no diretório do seu servidor para armazenar os arquivos. Este código é apenas um exemplo básico para ilustrar como você pode implementar a funcionalidade.


Bom dia, amigo! em Onplayerdisconnect, eu fiz algo parecido, porém,  percebi que há algumas coisa que posso mudar para resolver o problema. Irei verificar! +rep