Portal SAMP
[Ajuda] Fazer verificação com o nome do jogador - 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] Fazer verificação com o nome do jogador (/showthread.php?tid=4745)



Fazer verificação com o nome do jogador - Ryzen_ - 03/05/2024

Estou tentando criar um sistema de presentes, onde a minha ideia era do jogador poder pegar o presente assim que entrasse no servidor, e precisar aguardar 1h para pegar novamente. Até o momento não consegui prosseguir com isso, pois eu precisaria que o timer de 1h ficasse rodando, e que mesmo que o player reconectasse no servidor, fosse feita uma verificação através do nome dele para verificar se existe um timer ou uma variável setada para ele em específico. Eu primeiro tentei fazer utilizando o SetPVarInt, mas creio que ele não aceite o nome do jogador como variável, apenas o ID. Existe alguma forma de fazer através do nome? Caso saibam uma for melhor para fazer isso, aceito sugestões. Desde já, muito obrigado por todos que responderem ao tópico.


RE: Fazer verificação com o nome do jogador - White_Blue - 03/05/2024

Uma forma que você pode fazer isso (se usa MySQL):

1. Crie uma coluna no seu banco de dados para armazenar o valor quando o jogador pegar o presente;
2. Crie um timer global que roda a cada 1 hora;
3. Realize a query para setar para o valor da coluna para zero para todos os jogadores.

Query:
Código PHP:
UPDATE usuarios SET pegoupresente 0



RE: Fazer verificação com o nome do jogador - casti3l - 03/05/2024

new pTime[MAX_PLAYERS];
new pPresente[MAX_PLAYERS];
new pHora[MAX_PLAYERS];

CMD:pegarpresente(playerid, params[]){
if(pPresente[playerid] == 1) return SendClientMessage(playerid, -1, "Você já pegou um presente recentemente, aguarde 1h");
pPresente[playerid] = 1;
pHora[playerid] = (gettime() + (60 * 60 * 1));
pTime[playerid] = SetTimerEx("TempoPresente", 1000, true, "i", playerid);
SendClientMessage(playerid, -1, "Você pegou um presente");
return 1;
}

forward TempoPresente(playerid);
public TempoPresente(playerid){
if(pPresente[playerid] > 0 && gettime() >= pHora[playerid]){
SendClientMessage(playerid, -1, "Você ja pode pegar presente novamente");
KillTimer(pTime[playerid]);
pPresente[playerid] = 0;
}
return 1;
}

pode simplesmente armazenar em dof2 ou alguma outra que use.


RE: Fazer verificação com o nome do jogador - Ryzen_ - 03/05/2024

(03/05/2024 08:46)White_Blue Escreveu: Uma forma que você pode fazer isso (se usa MySQ):

1. Crie uma coluna no seu banco de dados para armazenar o valor quando o jogador pegar o presente;
2. Crie um timer global que roda a cada 1 hora;
3. Realize a query para setar para zero de todos os jogadores.

Query:
Código PHP:
UPDATE usuarios SET pegoupresente 0

Mas isso iria setar para todos, correto? Não teria como fazer isso para apenas o player em específico?


RE: Fazer verificação com o nome do jogador - White_Blue - 03/05/2024

(03/05/2024 13:56)Ryzen_ Escreveu:
(03/05/2024 08:46)White_Blue Escreveu: Uma forma que você pode fazer isso (se usa MySQ):

1. Crie uma coluna no seu banco de dados para armazenar o valor quando o jogador pegar o presente;
2. Crie um timer global que roda a cada 1 hora;
3. Realize a query para setar para zero de todos os jogadores.

Query:
Código PHP:
UPDATE usuarios SET pegoupresente 0

Mas isso iria setar para todos, correto? Não teria como fazer isso para apenas o player em específico?

Mas não seria isso o que você quer? Pois dessa forma ficaria sincronizado para todos os jogadores e sempre resetaria para todos a cada uma hora, mesmo que o jogador não esteja online.


RE: Fazer verificação com o nome do jogador - Ryzen_ - 03/05/2024

(03/05/2024 14:48)White_Blue Escreveu:
(03/05/2024 13:56)Ryzen_ Escreveu:
(03/05/2024 08:46)White_Blue Escreveu: Uma forma que você pode fazer isso (se usa MySQ):

1. Crie uma coluna no seu banco de dados para armazenar o valor quando o jogador pegar o presente;
2. Crie um timer global que roda a cada 1 hora;
3. Realize a query para setar para zero de todos os jogadores.

Query:
Código PHP:
UPDATE usuarios SET pegoupresente 0

Mas isso iria setar para todos, correto? Não teria como fazer isso para apenas o player em específico?

Mas não seria isso o que você quer? Pois dessa forma ficaria sincronizado para todos os jogadores e sempre resetaria para todos a cada uma hora, mesmo que o jogador não esteja online.

Não. O que eu queria era que fosse distindo de um para o outro. Seria um timer específico para cada jogador. Mas parando pra analisar melhor agora, isso ficaria muito pesado para o servidor suportar, já que se 100 players pegasse o presente nesse meio-tempo, poderiam ter até 100 timers sendo executados. Acho melhor fazer dessa forma que você disse mesmo, fazendo meio que um sistema de "payday", onde a cada hora que virasse, o jogador poderia pegar o prêmio.


RE: Fazer verificação com o nome do jogador - Carlos Victor - 04/05/2024

Não meu jovem, existem formas de fazer isso sem ter que criar 100 timers diferentes, a força mais fácil é criar uma variável e armazenar o valor gettime (timestamp) com +3600 segundos e verificar se esse valor é maior ou menos do que o tempo atual, ou seja, se for maior significa que o tempo de uma hora passou e se for menor, não passou ainda, segue o exemplo:

Código PHP:
new gPlayerGift[MAX_PLAYERS];

CMD:presente(playerid)
{
    new 
        
string[128], money;

    if (
gPlayerGift[playerid] > gettime()) {
        
format(stringsizeof(string), "* Aguarde %02d:%02d para pegar o próximo presente.", (gPlayerGift[playerid] - gettime()) / 60, (gPlayerGift[playerid] - gettime()) % 60);
        return 
SendClientMessage(playerid, -1string);
    }

    
gPlayerGift[playerid] = gettime() + 3600;
    
money random(1500) + 500// 500 - 2000

    
format(stringsizeof(string), "* Você pegou o presente e recebeu $%d!"money)
    
SendClientMessage(playerid, -1string);
    return 
1;


Aí, você pode usar essa variável para armazenar em alguma coluna do banco de dados.


RE: Fazer verificação com o nome do jogador - Ryzen_ - 08/05/2024

(04/05/2024 12:03)Carlos Victor Escreveu: Não meu jovem, existem formas de fazer isso sem ter que criar 100 timers diferentes, a força mais fácil é criar uma variável e armazenar o valor gettime (timestamp) com +3600 segundos e verificar se esse valor é maior ou menos do que o tempo atual, ou seja, se for maior significa que o tempo de uma hora passou e se for menor, não passou ainda, segue o exemplo:

Código PHP:
new gPlayerGift[MAX_PLAYERS];

CMD:presente(playerid)
{
    new 
        string[128], money;

    if (gPlayerGift[playerid] > gettime()) {
        format(stringsizeof(string), "* Aguarde %02d:%02d para pegar o próximo presente.", (gPlayerGift[playerid] - gettime()) / 60, (gPlayerGift[playerid] - gettime()) % 60);
        return SendClientMessage(playerid, -1string);
    }

    gPlayerGift[playerid] = gettime() + 3600;
    money random(1500) + 500// 500 - 2000

    format(stringsizeof(string), "* Você pegou o presente e recebeu $%d!"money)
    SendClientMessage(playerid, -1string);
    return 1;


Aí, você pode usar essa variável para armazenar em alguma coluna do banco de dados.

Não tinha pensado em fazer dessa forma, irei testar. Muito obrigado pela dica