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(playerid, reason) { // Obtenha o nome do jogador para usar como nome do arquivo new playerName[24]; GetPlayerName(playerid, playerName, sizeof(playerName)); // Crie um nome de arquivo único para o jogador new filename[40]; format(filename, sizeof(filename), "savedTimers/%s.txt", playerName); // Salve os minutos e segundos restantes em um arquivo new file:FileHandle = fopen(filename, io_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(playerid, playerName, sizeof(playerName)); // Crie um nome de arquivo único para o jogador new filename[40]; format(filename, sizeof(filename), "savedTimers/%s.txt", playerName); // Tente abrir o arquivo para carregar os minutos e segundos salvos new file:FileHandle = fopen(filename, io_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", remainingTime, false, "i", playerid); } else { // Se não houver dados salvos, crie um novo temporizador PaydayTimer[playerid] = SetTimerEx("PayDayc", 1000, true, "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(playerid, reason) { // Obtenha o nome do jogador para usar como nome do arquivo new playerName[24]; GetPlayerName(playerid, playerName, sizeof(playerName)); // Crie um nome de arquivo único para o jogador new filename[40]; format(filename, sizeof(filename), "savedTimers/%s.txt", playerName); // Salve os minutos e segundos restantes em um arquivo new file:FileHandle = fopen(filename, io_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(playerid, playerName, sizeof(playerName)); // Crie um nome de arquivo único para o jogador new filename[40]; format(filename, sizeof(filename), "savedTimers/%s.txt", playerName); // Tente abrir o arquivo para carregar os minutos e segundos salvos new file:FileHandle = fopen(filename, io_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", remainingTime, false, "i", playerid); } else { // Se não houver dados salvos, crie um novo temporizador PaydayTimer[playerid] = SetTimerEx("PayDayc", 1000, true, "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
|