29/11/2022 15:01
(Esta mensagem foi modificada pela última vez a: 29/11/2022 15:08 por Carlos Victor.)
"Sobre a função: gettime() . Ela faz a contagem mesmo com Player estando OFF?"
R: Sim e não, não sei como explico isso, mas basicamente a função gettime retorna o timestamp, ou seja o atual segundo que estamos desde 01/01/1970, que é mais ou menos 1669744360 (14:53:20 29/11/2022) atualmente, ou seja, a variável vai só armazenar esses segundos todos, vou dar um exemplo:
Eu talvez faria dessa forma:
R: Sim e não, não sei como explico isso, mas basicamente a função gettime retorna o timestamp, ou seja o atual segundo que estamos desde 01/01/1970, que é mais ou menos 1669744360 (14:53:20 29/11/2022) atualmente, ou seja, a variável vai só armazenar esses segundos todos, vou dar um exemplo:
Código:
enum PlayerInfo
{
pName[MAX_PLAYER_NAME],
pDonation
};
new PlayerData[MAX_PLAYERS][PlayerInfo];
Supondo que o jogador ganhou 30 dias de VIP, sei lá só um exeplo...
CMD:darvip(playerid, params[])
{
//...
PlayerData[id][pDonation] = gettime() + (days * 86400); // Como o gettime retorna segundos, temos que trabalhar em segundos, eu multiplico os dias de VIP dele por 86400 que é o equivalente a 1 dia em segundos, então sei lá se eu der 30 dias de VIP, vai ser 30 * 86400 = 2592000
// ^^ Ai, basicamente vai ser gettime() + 2592000; que vai ficar armazenado na variável, sabemos que daqui a 2592000 segundos, o VIP dele irá se expirar
return 1;
}
Para uma verificação é simples, faz assim:
if((PlayerData[playerid][pDonation] - gettime()) <= 0)
{
//Caso os 2592000 segundos tenham passado, vai negativar, menor que zero por conta da regra da subtração, o maior número primeiro e depois o menor, enfim...
} else {
SendClientMessage(playerid, -1, "* Você possui %s de VIP.", ConvertDate(PlayerData[playerid][pDonation] - gettime()));
}
stock ConvertTime(number) // Função que "formata" os segundos em datas, ou seja se for +60 segundos, 1 minuto, +3600 segundos = 1 hora e assim vai...
{
new hours, mins, secs, string[64], days = 0;
hours = floatround(number / 3600.0, floatround_floor);
mins = floatround((number / 60.0) - (hours * 60.0), floatround_floor);
secs = floatround((number % 60));
if(hours >= 24)
{
days = floatround((hours/24.0), floatround_floor);
hours = hours % 24;
}
if(days > 0)
format(string, 64, "%d dia(s) e %d hora(s)", days, hours);
else if(hours > 0)
format(string, 64, "%d hora(s) e %d minuto(s)", hours, mins);
else if(mins > 0)
format(string, 64, "%d minuto(s)", mins, secs);
else
format(string, 64, "%d segundo(s)", secs);
return string;
}
Qualquer dúvida, só avisar, mas basicamente é assim que funciona, não sei se expliquei bem.
Eu talvez faria dessa forma:
Código:
#include <a_samp>
#include <sscanf2>
#include <zcmd>
#include <foreach>
public OnGameModeInit()
{
SetTimer("OnUpdateAllPlayers", 1000, true);
return 1;
}
forward OnUpdateAllPlayers();
public OnUpdateAllPlayers()
{
foreach(new i : Player)
{
if(PlayerData[i][pDonate] != -1 && (PlayerData[i][pDonate] - gettime()) <= 0)
{
SendClientMessage(playerid, -1, "* Seus privilégios de doação acabou.");
PlayerData[i][pDonate] = -1;
}
}
return 1;
}
CMD:setdonate(playerid, params[])
{
new
id,
days;
if(sscanf(params, "uD(31)", id, days))
return SendClientMessage(playerid, -1, "* /setdonate [id] [days (optional)]");
if(!IsPlayerConnected(id))
return SendClientMessage(playerid, -1, "* Jogador não está conectado.");
new
string[128];
PlayerData[id][pDonate] = gettime() + (days * 86400);
format(string, sizeof(string), "* Você recebeu %s de privilégios de doador.", ConvertTime(PlayerData[playerid][pDonate] - gettime()));
SendClientMessage(id, -1, string);
return 1;
}
stock ConvertTime(number)
{
new hours, mins, secs, string[64], days = 0;
hours = floatround(number / 3600.0, floatround_floor);
mins = floatround((number / 60.0) - (hours * 60.0), floatround_floor);
secs = floatround((number % 60));
if(hours >= 24)
{
days = floatround((hours/24.0), floatround_floor);
hours = hours % 24;
}
if(days > 0)
format(string, 64, "%d dia(s) e %d hora(s)", days, hours);
else if(hours > 0)
format(string, 64, "%d hora(s) e %d minuto(s)", hours, mins);
else if(mins > 0)
format(string, 64, "%d minuto(s)", mins, secs);
else
format(string, 64, "%d segundo(s)", secs);
return string;
}