SA-MP Forums Archive
[Tutorial] Sistema de Vip usando SSCANF && DOF2 - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+----- Forum: Lançamentos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=56)
+----- Thread: [Tutorial] Sistema de Vip usando SSCANF && DOF2 (/showthread.php?tid=637186)



Sistema de Vip usando SSCANF && DOF2 - Jonorusc - 10.07.2017

Eae guys, tipo tem uns cara que pergunta como criar um sistema de vip, com dias, e expiraзгo!
ai eu ensinei no mйtodo strtok, agora vou ensinar no sscanf muito facil, qualquer 1 com uma logica boa, faz!
Primeiro vamos criar umas Stocks de: NomePlayer(playerid), armazena(geta) o nome do player sem fica usando direto o
new pnome, etc

PHP код:
stock NomePlayerid(playerid)
{
    new 
Nome[MAX_PLAYER_NAME]; 
    
GetPlayerName(playeridNomesizeof(Nome));
    return 
Nome

Vou criar tbm uma define pra usar String, sem fica criando as variaveis sempre que for usar!
PHP код:
#define SendStringMsg(%0,%1,%2,%3) do{new _string[128]; \ // quebra de linha
format(_string,sizeof(_string),%2,%3); SendClientMessage(%0,%1,_string);} while(False)
new 
False=false//  (while(False)
#define SendStringMsgToAll(%0,%1,%2) do{new _string[128]; \
format(_string,sizeof(_string),%1,%2); SendClientMessageToAll(%0,_string);} while(False
PHP код:
Ex:
SendStringMsg(%0,%1,%2,%3) = 
format(stringsizeof(string), " eu sou o %s id %d "dougrasplayerid);
SendClientMessage(playeridstring);
e somente vamos usar:
SendStringMsg(playeridCOR" eu sou o %s id %d "dougrasplayerid);
menos trabalho
SendStringMsgToAll
(%0,%1,%2) = 
format(stringsizeof(string), " eu sou o %s id %d "dougrasplayerid);
SendClientMessageToAll(CORstring);
Usaremos
SendStringMsgToAll
(COR"", var, var); 
vou criar outra stock para armazena onde vai ficar a pasta pra salva os dias
PHP код:
stock VIP_FILE(nick[]) {    new str[128]; format(str,128,"/SUAPASTA/Vips/%s.ini"nick); return str; } 
vocк jб deve ter sua pasta com os dados dos jogadores nick etc
la vamos guarda se o player e vip ou nгo!

PHP код:
enum pInfo{
  
VipExpiro,       //enum para nгo precisa criar VipExpiro[MAX_PLAYERS], e VIP[MAX_PLAYERS]
  
Vip
}
Player[MAX_PLAYERS][pInfo];// aqui e pra nos dizer que o jogador e vip, : Player = jogador, [MAX_PLAYERS pode ser o jogador que estб usando o comando /setvip = playerid, ou o jogador que o que esta usando disse, no caso  = ID, pinfo e oque ele й! 
Agora vamos comeзa o sistema.
Nos queremos setar por dias, 1 dia = 24*60*60 para nуs nгo ficar usando direto 12*60*60 vamos criar uma define que guarda esse valor
PHP код:
#define UMDIA 24*60*60 
nгo esqueзa de usar as Includes DOF2 e SSCANF
PHP код:
#include "DOF2"
#include "sscanf" // tem o sscanf2, depende do que vocк vai usar
//eu vou usar a processador de cmd: ocmd, tem outros como ZCMD, ou vocк pode usar o padrгo strcmp
#include "ocmd"
//lembrando que estas includes precisa esta na pasta Pawno/Includes 
se for usar o padrгo, use em:
PHP код:
public OnPlayerCommandText(playeridcmdtext[])
{
if(
strcmp("/setvip"cmdtexttrue10) == 0)
{
return 
1;
}
return 
SendClientMessage(playerid"[ ERROR ] >> Este comando nгo existe!"); se o player digita algo que nгo esta dentro do onplayercmdtextirar retorna essa msg para ele.
}
//fechando on player 
como vou usar ocmd, nгo precisamos cria-lo dentro de uma callback, recomendo em cima do onplayercommandtext ou no final do gm

PHP код:
ocmd:setvip(playerid,params[])
{
  new 
iddias
     if(!
IsPlayerAdmin(playerid)) return SendClientMessage(playeridERROR"[ ERRO ] » Vocк nгo tem permissгo para isso"); //rcon
vamos usar o sscanfvamos usar id jogador que o admin escolher pra virar vipe dias dias de vip
sscanf 
//d  = id
//u = id 
coloquei 2 idpq depende das includesminha eu uso D
//s = text
//i = int (numeros como 2453431) inteiros
//f - float (numeros como 1231.1232.1231) quebrados
//SE VCs NГO TROCAREM AS CORES PARA SUA EX: MINHA = BRANCO, SUA PODE SER =  WHITE
//irб da erro! 
    
if(sscanf(params"di"iddias)) return SendClientMessage(playeridERROR"[ ERROR ] Use: /setvip [player id] [dias]");
   
//se ele colocas dias = 0 ou mais que 360 dias, vai retorna a msg.
    
if(dias || dias 360)  return SendClientMessage(playeridERROR"[ ERROR ] » Vip minimo 1 dia maximo 1 ano! de 1 a 360 dias");
//se o id que ele escolheu estiver offline retorna a msg.
    
if(!IsPlayerConnected(id)) return SendClientMessage(playeridBRANCO"[ ERROR ] » Nenhuma pessoa online com esse ID");
//aqui eu vou seta o valor positivo ao jogador que eu escolhi para ser vip, e vou salva no arquivo dele, vcs ja devem ter feito seus sistema de salvamento, ent nгo vou ensinar essa parte, mas vou criar como se estivesse no meu sistema!
   
    
new String[128];  format(Stringsizeof(String), CONTAS); // aqui estou dizendo onde esta minha pasta com as contas dos registrados! novamente, vcs ja devem ter feito isso!
   
    
if(fexist(String)) //se essa minha pasta existe, eu vou seta-lo como Vip 1 = positivo, valor da varial vip negativa = 0
    
{
        
DOF2_SetInt(String,"Vip",1); //vou coloca no arquivo.ini que contem o nome dele na pasta REGISTRADOS, que ele tem a varavel vip com valor de 1
        
Player[id][Vip] = 1;
        
SendClientMessage(idBRANCO"Vocк virou player vip"); // nem preciso explicar
        
SendStringMsgToAll(AZUL"O GameMaster %s setou <%s> ID:<%i> de player vip por %d",NomePlayerid(playerid), pnameiddias); aqui jб expliquei
        Player
[id][VipExpiro] = gettime()+(UMDIA*dias); //as variбvel que nos criamos na enum  2 vip e Vipexpiro, vamos usar a vip pra dizer se e vip ou nao e a expiro pra dizer se os dias dele acabou ou nгo, a define 1 dia que nos criamos = 24*60*60 * dias = os dias que o setador escolheu, vai da o resultado = dias que ele tem de vip, e usamos o gettime para conta!
        
DOF2_CreateFile(VIP_FILE(NomePlayerid(id))); // agora aqui e a pasta que nos criamos pra salva os dias 
eu criei 2 porque senуs setado o valor dos diasna pasta dos registradosquando acabace os dias delenos teremos que apaga o arquivo com o nome deleai apagara praticamente a conta dele por completoent la salvei somenteo valor dizendo que ele e vippra nos usar nas horas de checar os comandoscomo /veh etccheca se ele e vip ou naose sim usa se nao retorna msg dizendo que nao.
        
DOF2_SetInt(VIP_FILE(NomePlayerid(id)), "Dias"dias); //vamos criar um arquivo com o nome do player, dentro do arquivo diz os dias que foi setado a ele.
        
DOF2_SetInt(VIP_FILE(NomePlayerid(id)), "VipExpiro",Player[id][VipExpiro]);aqui  praticamente nos criamos um checkque iremos usa no dialog do loginou em onplayerconnectaqui nos salvamos os dias tbmmas vamos usar essa variбvel Player[id][VipExpirojunto com o gettimemais a frente
        
DOF2_SaveFile(); //aqui vamos guarda tudo isso no arquivo.ini.
        
return 1;
    }
    else
    {
       
SendClientMessage(playerid,ERROR,"ERRO: Jogador nгo encontrado!"); //se esse a pasta nгo existe
       
return 1;
    }
}
//fechando setvip
Em onplayerconnect 
PHP код:
//lembra vamos usar essa variбvel : Player[id][VipExpiro] junto com o gettime! mais a frente! (kk)
ent chegou a horaela estб setada com o valor  de 24*60*60e vamos supor que o admin deu 7 dias ent24*60*60*7 diasnos usamos ela no gettime //Player[id][VipExpiro] = gettime()+(UMDIA*dias);
Player[playerid][VipExpiro] = DOF2_GetInt(VIP_FILE(NomePlayerid(playerid)), "VipExpira");
if(
Player[playerid][VipExpiro] < gettime()) // O tempo de vip acabou.  // se vipexpiro for igual 24*60*60*7 significa que os dias dele, chegou ao fim, gettime < que VipExpiro gettime = 7 vipexpiro tbm foi setado de 7, se o vipexpiro tiver maior que ele, ja passou 7 dias, ai ele perde vip
           
{
              
SendClientMessage(playeridAZUL"* Seu VIP expirou.");
              
Player[playerid][Vip] = 0//setamos o valor da variavel para false
              
DOF2_RemoveFile(VIP_FILE(NomePlayerid(playerid))); //e apagamos o arquivo com o nome dele, nгo do registrados mas sim da pasta vips assim ele somente perdera o vip e nгo a conta
           
}
           else    
// Tempo de vip ainda nao acabou
           
{
// se o vipexpiro dele tiver menor que o gettime, iremos dizer quanto tempo falta pra acabar, pra ele fica ligado
              
SendStringMsgTo(playeridAZUL"* Seu VIP expira em %s."Convert(Player[playerid][VipExpiro]-gettime())); //vamos supor que ele passou 4 dias de 7, 7 - 4 = 3, ent ele tem 3 dias de vip
              
Player[playerid][Vip] = 1//e deixaremos ainda com valor positivo
           

//explicaзгo muito ruim, eu msm to achando!

PHP код:
public OnGameModeExit()
{
    
DOF2_Exit();
    return 
1;

lembrei que vcs n tem o convert

PHP код:
Convert(number)
{
    new 
hours 0mins 0secs 0string[128];
    
hours floatround(number 3600);
    
mins floatround((number 60) - (hours 60));
    
secs floatround(number - ((hours 3600) + (mins 60)));
    new 
days 0;
    if(
hours >= 24)
    {
        
days floatround((hours/24), floatround_floor);
        
hours hours 24;
    }
    if(
days 0)
    {
        
format(string100"%ddias, %dh %dm e %ds"dayshoursminssecs);
    }
    else if(
hours 0)
    {
        
format(string100"%dh %dm e %ds"hoursminssecs);
    }
    else
    {
        
format(string100"%dm e %ds"minssecs);
    }
    return 
string;




Re: Sistema de Vip usando SSCANF && DOF2 - G4M30V3R - 10.07.2017

Vк-se que vocк nгo tem um bom preparo para querer ensinar, tampouco organizaзгo.
Compreendo que a intenзгo й boa, mas o propуsito de um tutorial й passar conhecimento e sanar dъvidas, nгo multiplicб-las.

Sгo pequenos detalhes:
0 (zero) nгo й false, й somente 0 (zero). Mesmo que pawn considere que false retorne 0 (zero), sгo tipos de dados diferentes.
Isto salva os dados somente na hora, mas nгo hб carregamento e salvamento ao desconectar-se...

Posso ter deixado passar algo batido, realmente nгo pude ler tudo.
De qualquer forma, parabйns por ter tentado!


Re: Sistema de Vip usando SSCANF && DOF2 - GuilhermeNunes - 10.07.2017

Falta Mais Explicaзгo e organizaзгo Mesmo Assim Boa