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 oai eu ensinei no mйtodo strtok, agora vou ensinar no sscanf muito facil, qualquer 1 com uma logica boa, faz!
new pnome, etc
PHP код:
- Código:
stock NomePlayerid(playerid)
{
new Nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, Nome, sizeof(Nome));
return Nome;
}
Vou criar tbm uma define pra usar String, sem fica criando as variaveis sempre que for usar!
PHP код:
- Código:
#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 код:
- Código:
Ex:
SendStringMsg(%0,%1,%2,%3) =
format(string, sizeof(string), " eu sou o %s id %d ", dougras, playerid);
SendClientMessage(playerid, string);
e somente vamos usar:
SendStringMsg(playerid, COR, " eu sou o %s id %d ", dougras, playerid);
menos trabalho
SendStringMsgToAll(%0,%1,%2) =
format(string, sizeof(string), " eu sou o %s id %d ", dougras, playerid);
SendClientMessageToAll(COR, string);
Usaremos
SendStringMsgToAll(COR, "", var, var);
vou criar outra stock para armazena onde vai ficar a pasta pra salva os dias
PHP код:
- Código:
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 код:
- Código:
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 код:
- Código:
#define UMDIA 24*60*60
nгo esqueзa de usar as Includes DOF2 e SSCANF
PHP код:
- Código:
#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 код:
- Código:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp("/setvip", cmdtext, true, 10) == 0)
{
return 1;
}
return SendClientMessage(playerid, "[ ERROR ] >> Este comando nгo existe!"); se o player digita algo que nгo esta dentro do onplayercmdtext, irar 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 код:
- Código:
ocmd:setvip(playerid,params[])
{
new id, dias;
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, ERROR, "[ ERRO ] » Vocк nгo tem permissгo para isso"); //rcon
vamos usar o sscanf, vamos usar : id = jogador que o admin escolher pra virar vip, e dias = dias de vip
sscanf
//d = id
//u = id
coloquei 2 id, pq depende das includes, minha 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", id, dias)) return SendClientMessage(playerid, ERROR, "[ ERROR ] Use: /setvip [player id] [dias]");
//se ele colocas dias = 0 ou mais que 360 dias, vai retorna a msg.
if(dias < 1 || dias > 360) return SendClientMessage(playerid, ERROR, "[ 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(playerid, BRANCO, "[ 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(String, sizeof(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(id, BRANCO, "Vocк virou player vip"); // nem preciso explicar
SendStringMsgToAll(AZUL, "O GameMaster %s setou <%s> ID:<%i> de player vip por %d",NomePlayerid(playerid), pname, id, dias); 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 se, nуs setado o valor dos dias, na pasta dos registrados, quando acabace os dias dele, nos teremos que apaga o arquivo com o nome dele, ai apagara praticamente a conta dele por completo, ent la salvei somente, o valor dizendo que ele e vip, pra nos usar nas horas de checar os comandos, como /veh etc. checa se ele e vip ou nao, se 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 check, que iremos usa no dialog do login, ou em onplayerconnect, aqui nos salvamos os dias tbm, mas vamos usar essa variбvel : Player[id][VipExpiro] junto com o gettime! mais 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 код:
- Código:
//lembra vamos usar essa variбvel : Player[id][VipExpiro] junto com o gettime! mais a frente! (kk)
ent chegou a hora, ela estб setada com o valor de 24*60*60, e vamos supor que o admin deu 7 dias ent: 24*60*60*7 = 7 dias, nos 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(playerid, AZUL, "* 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(playerid, AZUL, "* 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 код:
- Código:
public OnGameModeExit()
{
DOF2_Exit();
return 1;
}
lembrei que vcs n tem o convert
PHP код:
- Código:
Convert(number)
{
new hours = 0, mins = 0, secs = 0, string[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(string, 100, "%ddias, %dh %dm e %ds", days, hours, mins, secs);
}
else if(hours > 0)
{
format(string, 100, "%dh %dm e %ds", hours, mins, secs);
}
else
{
format(string, 100, "%dm e %ds", mins, secs);
Creditos: Jonorusc