Mostrando postagens com marcador Tutoriais. Mostrar todas as postagens
teste do eddy

[TUT] Completo usando DFile

terça-feira, 24 de janeiro de 2012

Descrição:

Bom, estou aqui para ensinar quem ainda não sabe sobre como utilizar o dfile.
Pra quem não sabe o dfile é um gerenciador de arquivos, muitos chamam de database, cache enfim, a função dele é intermediar entre o HD principal onde estão as informações até o solicitante da informação, em resumo com ele você poderá salvar informações como nível de admin, textos, logs ou qualquer coisa do gênero.

Funções:

Escrita e leitura:
► dfile_WriteInt(Tag, valor);
► dfile_WriteBool(Tag, true/false);
► dfile_WriteFloat(Tag, valor fracionado);
► dfile_WriteString(Tag, Texto);
► dfile_ReadInt(Tag);
► dfile_ReadBool(Tag);
► dfile_ReadFloat(Tag);
► dfile_ReadString(Tag);
► dfile_ReadPerseString(Tag, string);


Criação e remoção:
► dfile_Create(Arquivo[]);
► dfile_Delete(Arquivo[]);
► dfile_CreateDirectory(Pasta[]);
► dfile_DeleteDirectory(Pasta[]);


Verificação e outros:
► dfile_OpenFile(Arquivo);
► dfile_SaveFile();
► dfile_CloseFile();
► dfile_FileExists(Arquivo[]);
► dfile_DirectoryExists(Pasta[]);
► dfile_RenameFile(Arquivo[], NovoNome[]);
► dfile_IsSet(Tag);
► dfile_UnSet(Tag);


Como usar:

Bom, acima vocês viram quais são as funcionalidades do dfile, aprenderemos agora como usa-las com exemplos.

A programação em si segue uma lógica muito básica, assim como no seu dia-a-dia na programação você deve seguir etapas, exemplo.
Você quer setar um valor em um arquivo, antes você deverá verificar se ele existe, caso não exista você deverá cria-lo, nomea-lo, salva-lo e fecha-lo. Então, faremos isso.
Caso você tente escrever algo em um arquivo que não existe logicamente você não conseguirá.

► dfile_FileExists(Arquivo[]);
► dfile_OpenFile(Arquivo);
► dfile_SaveFile();
► dfile_CloseFile();


if(dfile_FileExists("Progressão.ini");

{

dfile_Open("Progressão.ini");

//Funções de escrita

SaveFile();

CloseFile();

}

Explicação:
Bom, com esses passos iremos verificar se o arquivo Progressão.ini existe na scriptfiles usando o id(se) e o dfile_FileExists... caso ele exista, ele após a chave { será aberto usando dfile_Open("Progressão.ini"); Será escrito algo nele(Você deverá usar a função de escrita no lugar da anotação), após isso será salvo o arquivo e será fechado.

Por que no SaveFile e Closefile não precisa do parametro(Arquivo)? Simples, porque a ação SaveFile e CloseFile são direcionadas ao arquivo aberto no momento... Diferente de Dini, o DFile abre apenas o arquivo necessário evitando assim muitas contas desnecessárias por segundo.

► dfile_Create(Arquivo[]);
► dfile_WriteInt(Tag, valor);
► dfile_WriteBool(Tag, true/false);
► dfile_WriteFloat(Tag, valor fracionado);
► dfile_WriteString(Tag, Texto);




if(!dfile_FileExists("Progressão.ini"))//Verifica se NÃO existe por causa do ! Exclamação

{

dfile_Create("Progressão.ini"); //Caso não exista ele criará, pois está entre as chaves

}

dfile_Open("Progressão.ini");

dfile_WriteInt("NumeroInteiro", 12345);     //Numeros inteiros, sem fração

dfile_WriteBool("VerdadeiroOuFalso", true); //Variável booleanea, true ou false = verdadeiro ou falso

dfile_WriteFloat("NumeroFracionado", 1234.56789); //Numeros fracionados como coordenada de mapas, quantia de vida entre outros

dfile_WriteString("TextoQualquer", "Progressão Pawn, envolvendo jogadores revolucionando servidores"); //Qualquer tipo de texto

dfile_SaveFile();

dfile_CloseFile();


Explicação:
Caso o arquivo "Progressão.ini" não exista ele será criado pois está entre as chaves, após ele ser criado, será aberto e então será escrito escrito as informações no arquivo, WriteInt serve pra escrever numeros inteiros sem fração, é aceito numeros de 0 à 9(Claro, podendo ser juntos formando dezenas, centenas e assim por diante).
WriteBool salva valores booleaneos que são true/false verdadeiro/falso positivo/negativo.
WriteFloat salva valores fracionados como a coordenada X, Y, Z do mapa entre outras coisas.
WriteString Salva qualquer tipo de texto, sendo ele junto com números ou não, apenas números ou apenas letras, geralmente usado para salvar senhas/logs entre outras informações.
Após escrever esses dados no arquivo ele será salvo e fechado, é bom lembrar que caso você não salve este texto ao fechar o arquivo já não será mais possível ler os dados no arquivo.

► dfile_ReadInt(Tag);
► dfile_ReadBool(Tag);
► dfile_ReadFloat(Tag);
► dfile_ReadString(Tag);


new varInt, Float:varFloat, bool:varBool, varString[128];

if(dfile_FileExists("Progressão.ini"))//Verifica se existeo arquivo

{

dfile_Open("Progressão.ini");                //Caso exista será aberto

varInt = dfile_WriteInt("NumeroInteiro");     //O numero inteiro nesta tag será escrito na varInt

varBool = dfile_WriteBool("VerdadeiroOuFalso"); //O valor bool que estiver nesta tag será escrito na varBool

varFloat = dfile_WriteFloat("NumeroFracionado"); //O numero frácionado que estiver nesta tag será escrito na varFloat

varString = dfile_WriteString("TextoQualquer"); //O texto que estiver nesta tag será escrito na variável varString

dfile_CloseFile(); //Fechará o arquivo sem salvar pois você apenas fez leituras e não alterou nada

}


Explicação:
O script criará as variáveis varInt, varFloat, varBool e varString cada uma com suas respectivas tags, caso o arquivo exista a varInt terá o valor da tag NumeroInteiro atribuído a ela. a varBool terá o valor da tag VerdadeiroOuFalso atribuído à ela, a varFloat terá o valor da tag NumeroFracionado atribuído à ela e a varString terá o texto na tag TextoQualquer atribuído à ela.
Você pode usar também o dfile_ReadPerseString que compara uma string à tag.

► dfile_Create(Arquivo[]);
► dfile_Delete(Arquivo[]);
► dfile_CreateDirectory(Pasta[]);
► dfile_DeleteDirectory(Pasta[]);


if(dfile_FileExists("Progressão.ini"))

{

dfile_Delete("Progressão.ini"); //Deleta o arquivo se existir

}

if(!dfile_FileExists("Progressão.ini"))

{

dfile_Create("Progressão.ini"); //Cria o arquivo se não existir

}



if(!dfile_DirectoryExists("ForumSamp"))

{

dfile_DCreateirectory("ForumSamp"); //Cria a pasta se não existir

}

if(dfile_DirectoryExists("ForumSamp"))

{

dfile_DeleteDirectory("ForumSamp"); //Deleta a pasta se existir

}


Explicação: Nas anotações.


► dfile_RenameFile(Arquivo[], NovoNome[]);
► dfile_IsSet(Tag);
► dfile_UnSet(Tag);



if(dfile_FileExists("Progressão.ini"))

{

if(dfile_IsSet("Exemplo"); //Verifica se a TAG Exemplo tem algum valor

{

dfile_UnSet("Exemplo"); //Tira o valor da TAG Exemplo se existir

}

return 1;

}




dfile_RenameFile("Progressao.ini", "ProgressaoPawn.ini");

Explicação:
Se o arquivo Progressão.ini existir ele vai verificar se a tag 'Exemplo' tem algum valor setado usando dfile_IsSet e caso tenha um valor setado ele irá retirar este valor usando dfile_UnSet.


[TUT] Criando switch [PP]





O que é um switch?
Switch é um comparador de resultados semelhante ao if e else if porem com uma estrutura diferenciada, em alguns casos chega à ser mais rápido(caso usado corretamente com auxilio de break).

Exemplo de uso:
Vamos tomar por exemplo o comando /admins, em vez criarmos um if seguido de vários else if pra cada nível de admin à aparecer no /admins precisaremos apenas criar um switch(função) seguido de cases, o case servirá como o else if mas de uma maneira mais compacta e otimizada pois só armazenará o numero(enum) à ser verificado, abaixo o exemplo do /admins por if e o /admins por switch.


if (strcmp(cmd, "/admins", true) == 0)

{

for(new i = 0; i <= MAX_PLAYERS; i++) {     if(IsPlayerConnected(i) == 1 && PlayerInfo[i][pAdmin] > 0)  {

    if(PlayerInfo[i][pTrampo] == 1) { GetPlayerName(i, sendername, sizeof(sendername));

if(PlayerInfo[i][pAdmin] == 1)

{

    format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername);

SendClientMessage(playerid, COR_ADMINS, string);

}

if(PlayerInfo[i][pAdmin] == 2)

{

format(string, 256, "Nome: %s [Administração Nível 2] (Trabalhando)", sendername);

SendClientMessage(playerid, COR_ADMINS, string);

}

if(PlayerInfo[i][pAdmin] == 3)

{

format(string, 256, "Nome: %s [ Administração Nível 3] (Trabalhando)", sendername);

    SendClientMessage(playerid, COR_ADMINS, string);

}

}

}

return 1;

}


O exemplo acima mostra como seria um /admins usando else if, veja como ficaria este comando usando switch abaixo.

if (strcmp(cmd, "/admins", true) == 0)

{

 for(new i = 0; i <= MAX_PLAYERS; i++)  {      switch(PlayerInfo[i][pAdmin])//Função a ser verificada   {       case 1: { format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 1       case 2: { format(string, 256, "Nome: %s [Administrador nível 2] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 2       case 3: { format(string, 256, "Nome: %s [Administrador nível 3] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 3       default: { Aqui a função a ser execultada caso nada se iguale aos resultados acima. }      }  }     return 1; }


É lógico que nem todos os comandos /admin serão assim.

Criando o seu switch:
Crie seu switch com a função à ser verificada que quiser, mas siga este formato abaixo:

switch (Função) //Coloque por exemplo um PlayerInfo[player][info] ou qualquer outra coisa

{

 case 1:

 {

  //O que deve ser executado caso seja igual a 1

  return true;

 }

 case 2:

 {

  //O que deve ser executado caso seja igual a 2

  return true;

 }

 case 3:

 {

  //O que deve ser executado caso seja igual a 3 }

  return true;

 }

 default: //Não obrigatório

 {

  //O que deve ser executado caso não seja igual aos exemplos acima

 }

}


Lembrando, não necessariamente o resultado deverá seguir este padrão de 1, 2, 3.... Você tem total liberdade pra pular ou adequar valores.

Você pode também modificar a forma do case, pra procurar por mais de um resultado como no exemplo abaixo:

case 1, 2, 3:

{

 //O que deve ser executado caso seja igual a 1, 2 ou 3

 return true;

}


em um if você teria que usar algo maior como este abaixo

if (Função == 1 || Função == 2 || Função == 3) //Ou como os valores são consecutivos usar operadores relacionais < >

{

 O que deve ser executado caso a função seja igual a 1, 2 ou 3

 return true;

}


Você pode também verificar resultados de um numero à outro, como no exemplo abaixo.

case 1 .. 10:

{

 //O que deve ser executado caso o resultado se enquadre entre 1 e 10

 return true;

}


Em if ficaria assim

if (Função >= 1 && Função <= 3) {  //O que deve ser executado caso a Função se enquadre entre ou igual 1 ou 4  return true; } 


Abaixo um exemplo bem distinto dos cases:

if (strcmp(cmd, "/org", true) == 0)

{

switch (PlayerInfo[playerid][pMembro])

{

 case 1 .. 3:

 {

         SendClientMessage(playerid, Cor, "Você pertence a uma org igual ou entre 1 e 3");

 }

 case 7, 8, 10:

 {

         SendClientMessage(playerid, Cor, "Você pertence a org 7, 8 ou 10");

 }

 case 4:

 {

         SendClientMessage(playerid, Cor, "Você pertence a org 4");

 }

 default:

 {

         SendClientMessage(playerid, Cor, "Você pertence a uma org que não é 1, 2, 3, 4, 7, 8 ou 10");

 }

}

return 1:

}


Qualquer duvidas é só perguntar, como sempre.
Créditos: Josma_CMD
Agradecimento à: Progressão Pawn

[TUT] - Sitema De Doença Simples

segunda-feira, 23 de janeiro de 2012

Ola pessoal da Lume SA:MP. Nesse tutorial vou ensinar vocês a fazerem um sistema de doença simples e excelente para RPGs.

Primeiro defina as cores das mensagens:

#define COLOR_RED 0xFF0000AA
#define COR_VERDECLARO 0x9ACD32AA
Agora crie uma array e um forward no topo do seu gamemode com o nome da sua doença, no nosso exemplo a doença vai ser a gripe:

new Gripe[MAX_PLAYERS];
forward PegarGripe();

Agora crie um public no final do seu gamemode com o nome do forward que você criou:

public PegarGripe(playerid,);
{
for(new i=0; i
Gripe[i]++; //adiciona um valor na variavel da doença
SendClientMessage(playerid,COLOR_RED,"Você pegou gripe! Vá até uma famacia comprar remédio."); //mensagem que vai aparecer quando você pegar a doença
if(Gripe[i] == 100) //caso o valor da variavel da doença chegue a 100 você vai morrer
{
SetPlayerHealth(i,0.0);
SendClientMessage(
playerid,COLOR_RED,"A gripe te matou! Quem mandou não comprar remédio...");//mensagem que vai aparecer quando você morrer por causa da doença
}
}
}
Agora no OnPlayerDeath coloque:

if(Gripe[playerid] == 100) //quando você morrer com o valor da variavel da doença com o valor 100 o valor da variavel será resetado
{
Gripe[playerid] = 0; //seta o valor da variavel da doença para zero
SendClientMessage(playerid,COR_VERDECLARO,"No hospital os médicos curaram sua gripe! Pode ficar tranquilo, por enquanto..."); //mensagem que vai aparecer quando o valor da variavel da doença for resetado
}

Agora no OnGameModeInit coloque:

SetTimer("PegarGripe", 5000000000000, true);//com isso os players pegaram a doença à cada 5 Dias +/-
E aqui é o fim do tutorial
Postador:MatriX