[TUT]SA-MP

Diego B. Silva 15:53



Olá, este é um tutorial em vídeo feito pelo Shickcard(Scripter do Progressão) sobre como criar um comando básico em dcmd; O processador de comandos mais otimizado nos tempos da 0.2x E até prático nos dias de hoje.

Créditos: Shickcard.


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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (strcmp(cmd, "/admins", true) == 0)
<BR>{
<BR>for(new i = 0; i <= MAX_PLAYERS; i++) {     if(IsPlayerConnected(i) == 1 && PlayerInfo[i][pAdmin] > 0)  {
<BR>    if(PlayerInfo[i][pTrampo] == 1) { GetPlayerName(i, sendername, sizeof(sendername));
<BR>if(PlayerInfo[i][pAdmin] == 1)
<BR>{
<BR>    format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername);
<BR>SendClientMessage(playerid, COR_ADMINS, string);
<BR>}
<BR>if(PlayerInfo[i][pAdmin] == 2)
<BR>{
<BR>format(string, 256, "Nome: %s [Administração Nível 2] (Trabalhando)", sendername);
<BR>SendClientMessage(playerid, COR_ADMINS, string);
<BR>}
<BR>if(PlayerInfo[i][pAdmin] == 3)
<BR>{
<BR>format(string, 256, "Nome: %s [ Administração Nível 3] (Trabalhando)", sendername);
<BR>    SendClientMessage(playerid, COR_ADMINS, string);
<BR>}
<BR>}
<BR>}
<BR>return 1;
<BR>}
<BR>


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

1
2
3
if (strcmp(cmd, "/admins", true) == 0)
<BR>{
<BR> 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
switch (Função) //Coloque por exemplo um PlayerInfo[player][info] ou qualquer outra coisa
<BR>{
<BR> case 1:
<BR>    {
<BR>        //O que deve ser executado caso seja igual a 1
<BR>        return true;
<BR>    }
<BR> case 2:
<BR>    {
<BR>        //O que deve ser executado caso seja igual a 2
<BR>        return true;
<BR>    }
<BR> case 3:
<BR>    {
<BR>        //O que deve ser executado caso seja igual a 3 }
<BR>        return true;
<BR>    }
<BR> default:   //Não obrigatório
<BR>    {
<BR>        //O que deve ser executado caso não seja igual aos exemplos acima
<BR>    }
<BR>}
<BR>


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:

1
2
3
4
5
6
case 1, 2, 3:
<BR>{
<BR>    //O que deve ser executado caso seja igual a 1, 2 ou 3
<BR>    return true;
<BR>}
<BR>


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

1
2
3
4
5
6
if (Função == 1 || Função == 2 || Função == 3) //Ou como os valores são consecutivos usar operadores relacionais < >
<BR>{
<BR>    O que deve ser executado caso a função seja igual a 1, 2 ou 3
<BR>    return true;
<BR>}
<BR>


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

1
2
3
4
5
6
case 1 .. 10:
<BR>{
<BR>    //O que deve ser executado caso o resultado se enquadre entre 1 e 10
<BR>    return true;
<BR>}
<BR>


Em if ficaria assim

1
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (strcmp(cmd, "/org", true) == 0)
<BR>{
<BR>switch (PlayerInfo[playerid][pMembro])
<BR>{
<BR> case 1 .. 3:
<BR> {
<BR>         SendClientMessage(playerid, Cor, "Você pertence a uma org igual ou entre 1 e 3");
<BR> }
<BR> case 7, 8, 10:
<BR> {
<BR>         SendClientMessage(playerid, Cor, "Você pertence a org 7, 8 ou 10");
<BR> }
<BR> case 4:
<BR> {
<BR>         SendClientMessage(playerid, Cor, "Você pertence a org 4");
<BR> }
<BR> default:
<BR> {
<BR>         SendClientMessage(playerid, Cor, "Você pertence a uma org que não é 1, 2, 3, 4, 7, 8 ou 10");
<BR> }
<BR>}
<BR>return 1:
<BR>}
<BR>


Qualquer duvidas é só perguntar, como sempre.

Créditos: Josma_CMD
Agradecimento à: Progressão Pawn



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();


1
2
3
4
5
6
7
if(dfile_FileExists("Progressão.ini");
<BR>{
<BR>dfile_Open("Progressão.ini");
<BR>//Funções de escrita
<BR>SaveFile();
<BR>CloseFile();
<BR>}

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);




1
2
3
4
5
6
7
8
9
10
11
if(!dfile_FileExists("Progressão.ini"))//Verifica se NÃO existe por causa do ! Exclamação
<BR>{
<BR>dfile_Create("Progressão.ini"); //Caso não exista ele criará, pois está entre as chaves
<BR>}
<BR>dfile_Open("Progressão.ini");
<BR>dfile_WriteInt("NumeroInteiro", 12345);     //Numeros inteiros, sem fração
<BR>dfile_WriteBool("VerdadeiroOuFalso", true); //Variável booleanea, true ou false = verdadeiro ou falso
<BR>dfile_WriteFloat("NumeroFracionado", 1234.56789); //Numeros fracionados como coordenada de mapas, quantia de vida entre outros
<BR>dfile_WriteString("TextoQualquer", "Progressão Pawn, envolvendo jogadores revolucionando servidores"); //Qualquer tipo de texto
<BR>dfile_SaveFile();
<BR>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);


1
2
3
4
5
6
7
8
9
10
new varInt, Float:varFloat, bool:varBool, varString[128];
<BR>if(dfile_FileExists("Progressão.ini"))//Verifica se existeo arquivo
<BR>{
<BR>dfile_Open("Progressão.ini");                //Caso exista será aberto
<BR>varInt = dfile_WriteInt("NumeroInteiro");     //O numero inteiro nesta tag será escrito na varInt
<BR>varBool = dfile_WriteBool("VerdadeiroOuFalso"); //O valor bool que estiver nesta tag será escrito na varBool
<BR>varFloat = dfile_WriteFloat("NumeroFracionado"); //O numero frácionado que estiver nesta tag será escrito na varFloat
<BR>varString = dfile_WriteString("TextoQualquer"); //O texto que estiver nesta tag será escrito na variável varString
<BR>dfile_CloseFile(); //Fechará o arquivo sem salvar pois você apenas fez leituras e não alterou nada
<BR>}


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[]);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(dfile_FileExists("Progressão.ini"))
<BR>{
<BR>dfile_Delete("Progressão.ini"); //Deleta o arquivo se existir
<BR>}
<BR>if(!dfile_FileExists("Progressão.ini"))
<BR>{
<BR>dfile_Create("Progressão.ini"); //Cria o arquivo se não existir
<BR>}
<BR>
<BR>if(!dfile_DirectoryExists("ForumSamp"))
<BR>{
<BR>dfile_DCreateirectory("ForumSamp"); //Cria a pasta se não existir
<BR>}
<BR>if(dfile_DirectoryExists("ForumSamp"))
<BR>{
<BR>dfile_DeleteDirectory("ForumSamp"); //Deleta a pasta se existir
<BR>}


Explicação: Nas anotações.


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



1
2
3
4
5
6
7
8
if(dfile_FileExists("Progressão.ini"))
<BR>{
<BR>if(dfile_IsSet("Exemplo"); //Verifica se a TAG Exemplo tem algum valor
<BR>{
<BR>dfile_UnSet("Exemplo"); //Tira o valor da TAG Exemplo se existir
<BR>}
<BR>return 1;
<BR>}




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.



Clique aqui para fazer o download!
Créditos:
Tutorial by: Josma_CMD
Agradecimento: Progressão Pawn

Progressão Pawn envolvendo jogadores revolucionando servidores.



Bom, vim em resposta à um pedido criar um tutorial completo de como fazer orgs/profissões/gangs em seu GameMode RPG.

Antes de tudo quero pedir desculpa pelos BR
nos códigos, retirem eles caso tentem fazer seus códigos pois isto é proporcional ao código HTML do blooger(O qual não pude tirar).

Índice

● Criar orgs com cargos
● Criar veiculos para orgs
● Criar comando /membros
● Criar comandos para líderes /convidar /promover /demitir
● Banco de dados para salvamento de orgs
● Criar cores paras orgs

Necessário

● Saber utilizar strtok
● Saber utilizar variáveis
● Saber utilizar operadores
● Saber utilizar database(No caso usaremos dini).

Bom, antes de tudo quero esclarecer que este não é um código útil e sim um tutorial, não copie e edite, leia, entenda e crie seu sistema.

Parte 1, criando suas organizações: Bom, decidi sair do velho esquema rotineiro de orgs do GF, então nosso enum será diferente, o enum cria arrays dentro de arrays, fazendo juz ao nome, enuméricos ou enumerados, o enum funciona quase como o new, você pode criar várias variáveis a partir dele utilizando vírgula para separar umas das outras, irei criar aqui 3 organizações como exemplo neste enum.

1
2
3
4
5
6
enum Info
{
PMilitar,
Groove,
Ballas
};

Não é obrigatório e também não faz diferença a utilização de vírgula na ultima variável da enum, eu não coloco mas isso é uma opção de cada um, enfim, o enum criado precisaremos de uma variável como tipo de dados para podermos usa-la em diferentes situações e para diferentes players, para isso usaremos o MAX_PLAYERS que no caso cria uma variável para cada ID de player, o MAX_PLAYERS é equivalente a 500 então é aconselhável que você crie uma diretiva no início do GM definindo o numero de slots que seu servidor usa, logo após, utilize essa diretivo no lugar do MAX_PLAYERS pré definido no a_samp.
1
new PlayerInfo[MAX_PLAYERS][Info];

Como podem perceber acima criei a variável PlayerInfo, o nome é de sua preferencia, esta variável tem o valor MAX_PLAYERS, ou seja, poderei usar em diversas ocasiões utilizando playerid, giveplayerid ou qualquer outro tipo de variável que acumule o id de um player, na outra array eu utilizo o enum Info, assim poderemos usar qualquer uma das variáveis disponíveis no enum.

Parte 2, entrando nas organizações: Bom, criada as organizações, agora deveremos entrar nelas, pra isso iremos fazer 3 comandos, /Convidar, /Demitir, /Promover.
Não esqueça de criar o new tmp[128]; no inicio da OnPlayerCommandText junto com as outras variáveis, cmd e idx, também coloque o strtok no fim do gamemode.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
if(strcmp(cmd, "/convidar", true) == 0)
{
tmp = strtok(cmdtext, idx);
new PlayerB;
if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /convidar [id]");
PlayerB = strval(tmp);
if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado");
if(PlayerInfo[playerid][PMilitar] >= 6)
{
PlayerInfo[PlayerB][PMilitar] = 1;
SendClientMessage(PlayerB, Branco, "Você entrou à Polícia Militar");
SetPlayerColor(PlayerB, Cor_PMilitar);
return 1;
}
else if(PlayerInfo[playerid][Groove] >= 6)
{
PlayerInfo[PlayerB][Groove] = 1;
SendClientMessage(PlayerB, Branco, "Você entrou à Groove");
SetPlayerColor(PlayerB, Cor_Groove);
return 1;
}
else if(PlayerInfo[playerid][Ballas] >= 6)
{
PlayerInfo[PlayerB][Ballas] = 1;
SendClientMessage(PlayerB, Branco, "Você entrou aos Ballas");
SetPlayerColor(PlayerB, Cor_Ballas);
return 1;
}
return 1;
}

Existem diversas formas de fazer um comando /convidar, essa não é a mais otimizada porém achei a mais simples para explicar sobre o código, não vou explicar sobre o que o strtok faz pois creio que muitos já sabem e caso não saibam é só dizer que explico ou crio outro tutorial, enfim, voltando ao código, ao digitar /convidar [id] o if se encarregará de verificar se o jogador é da PMilitar, e se ele tem o cargo igual ou maior que 6, que no caso estamos utilizando como um padrão para líder, mude conforme sua escolha, caso ele seja da Policia Militar e tiver o cargo requerido será setado ao PlayerB(convidado) a cor da policia militar e a org Policia militar, o mesmo processo acontece mas 3 orgs seguintes, foi apenas adicionado o else para a cadeia de decisões, se, mas se...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(strcmp(cmd, "/promover", true) == 0)
{
tmp = strtok(cmdtext, idx);
new PlayerB, level;
if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]");
PlayerB = strval(tmp);
if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]");
level = strval(tmp);
if(level < 1 || level > 6) return SendClientMessage(playerid, Branco, "O level deve ser maior que 0 e menor que 7");
new string[128], promovedor[MAX_PLAYER_NAME];
GetPlayerName(playerid, promovedor, sizeof(promovedor));
if(PlayerInfo[playerid][PMilitar] >= 6)
{
if(PlayerInfo[PlayerB][PMilitar] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua org");             PlayerInfo[PlayerB][PMilitar] = level;             format(string, sizeof(string), "Você foi promovido a level %d por %s", level, promovedor););             SendClientMessage(PlayerB, Branco, string);             return 1;         }         else if(PlayerInfo[playerid][Groove] >= 6)
{
if(PlayerInfo[PlayerB][Groove] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua org");             PlayerInfo[PlayerB][Groove] = level;             format(string, sizeof(string), "Você foi promovido a level %d por %s", level, promovedor););             SendClientMessage(PlayerB, Branco, string);             return 1;         }         else if(PlayerInfo[playerid][Ballas] >= 6)
{
if(PlayerInfo[PlayerB][Ballas] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua org");             PlayerInfo[PlayerB][Ballas] = level;             format(string, sizeof(string), "Você foi promovido a level %d por %s", level, promovedor););             SendClientMessage(PlayerB, Branco, string);             return 1;         }         return 1;     }

O comando /promover acima segue a mesma ordem do /convidar, verifica a organização do player primário na ação e executa a ordem no player secundário que no caso seria o PlayerB, como disse no outro comando, não vou explicar sobre strtok neste tutorial.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(strcmp(cmd, "/demitir", true) == 0)
{
tmp = strtok(cmdtext, idx);
new PlayerB, string[128], demitidor[MAX_PLAYER_NAME];
if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /demitir [id]");
PlayerB = strval(tmp);
GetPlayerName(playerid, demitidor, sizeof(demitidor));
if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado");
if(PlayerInfo[playerid][PMilitar] >= 6)
{
if(PlayerInfo[PlayerB][PMilitar] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua organização");             PlayerInfo[PlayerB][PMilitar] = 0;             format(string, sizeof(string), "Você foi demitido por %s", demitidor);             SendClientMessage(PlayerB, Branco, string);             return 1;         }         else if(PlayerInfo[playerid][Groove] >= 6)
{
if(PlayerInfo[PlayerB][Groove] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua organização");             PlayerInfo[PlayerB][Groove] = 0;             format(string, sizeof(string), "Você foi demitido por %s", demitidor);             SendClientMessage(PlayerB, Branco, string);             return 1;         }         else if(PlayerInfo[playerid][Ballas] >= 6)
{
if(PlayerInfo[PlayerB][Ballas] < 1) return SendClientMessage(playerid, Branco, "Este jogador não é da sua organização");             PlayerInfo[PlayerB][Ballas] = 0;             format(string, sizeof(string), "Você foi demitido por %s", demitidor);             SendClientMessage(PlayerB, Branco, string);             return 1;         }         return 1;     }

O comando demitir é Muito básico, entendendo os dois primeiros você entenderá ele também, creio que todo mundo saibam se quiserem explicações mais detalhadas sobre o comando só perguntar.

Bom, como vocês viram estes comandos utilizam algumas cores, provavelmente vocês não terão essas cores em seus GM´s então é só criar algumas diretivas relativas as cores.

1
2
3
4
#define Cor_PMilitar 0x4169E199
#define Cor_Groove 0x00FF0099
#define Cor_Ballas 0xA020F099
#define Branco 0xFFFFFFFF

O código de cor na diretiva é muito simples, 0x = definição de que "É" uma cor, os 6 primeiros caracters após o 0x são do código da cor e os 2 ultimos da transparência da cor.

Parte 3, Criando veiculos paras organizações: Antes de tudo você precisa aprender a mexer com variáveis então se ainda não souber leia outro tutorial, Vamos criar os veiculos paras orgs, para isso, tenha em mãos as coordenadas e os modelos dos veiculos que deseja criar, vamos lá.

Vamos supor que a Policia Militar tenha 4 carros, então criaremos a variável com o valor 4 pois começaremos do 0 e não podemos esquecer do Null, deixaremos isso quase como se fosse uma margem de erro.

1
new VPMilitar[5];

Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
1
2
3
4
VPMilitar[0] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 0
VPMilitar[1] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 1
VPMilitar[2] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 2
VPMilitar[3] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 3

Está criado os veiculos da Policia Militar, siga o mesmo exemplo para criar os veículos de outras organizações, apenas troque o numero das variáveis e os nomes das mesmas conforme o numero de veículos e o nome da próxima org.

Parte 4, Impedindo que outros peguem seus veiculos: Bom, vamos bloquear os veículos para que membros de outras organizações não o peguem, existem inicialmente duas maneiras de fazer isso, com a public OnPlayerEnterVehicle ou com a public OnPlayerStateChange, vou usar a OnPlayerStateChange...

1
2
3
4
5
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER) VerificarVeiculo(playerid);
return 1;
}

Notem que tem uma sintaxe que não é padrão nesta public, a sintaxe VerificarVeiculo, bom, teremos que criar ela então vamos lá.

1
2
3
4
forward VerificarVeiculo(playerid);
public VerificarVeiculo(playerid)
{
for(new c = 0; c <= 4; c++)     {         if(IsPlayerInVehicle(playerid, VPMilitar[c]) && PlayerInfo[playerid][PMilitar] < 1)         {             SendClientMessage(playerid, Branco, "Você não é da Policia Militar");             RemovePlayerFromVehicle(playerid);             return 1;         }     }     return 1; }

O laço for irá fazer uma conta rápida verificando possíveis valores do 0 ao 4, na if seguinte ele verificará se o Player está no veiculo C que pode ser equivalente de 0 a 4 e se ele não é da policia militar, caso a resposta para esta ação seja SIM ele removerá o player do veiculo e dirá a ele que aquele veiculo não pertence a sua organização.

Para reproduzir este código com outras organizações você pode usar o mesmo laço for e adicionar mais if's, else if's e aumentar o numero do laço conforme o numero de veiculos da org maxíma ou pode criar outros laços de conta, você pode também verificar resultado por resultado usando o GetPlayerVehicleID.

Parte 5, Salvando sua org: Bom, salvaremos a org do player em dini, então ai vai o código.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
forward SalvarOrg(playeri);
public SalvarOrg(playerid)
{
new arquivo[60], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(arquivo, sizeof(arquivo), "Contas\%s.ini", nome);
if(!dini_Exists(arquivo))
{
dini_Create(arquivo);
}
if(PlayerInfo[playerid][PMilitar] > 0) dini_IntSet(arquivo, "PMilitar", PlayerInfo[playerid][PMilitar]);
if(PlayerInfo[playerid][Groove] > 0) dini_IntSet(arquivo, "Groove", PlayerInfo[playerid][Groove]);
if(PlayerInfo[playerid][Ballas] > 0) dini_IntSet(arquivo, "Ballas", PlayerInfo[playerid][Ballas]);
return 1;
}

Explicação: criei as variáveis arquivo e nome para acumularem dado do tipo char, elas vão acumular strings, nome vai acumular o nome do player na ação e arquivo o caminho onde será salva suas informações, GetPlayerName pega o nome do playerid e salva na variável nome, o format seta o caminho onde será salvo as informações na variável arquivo, e pra isso ele precisa da variável nome, para criar um arquivo pra cada player.
if(!dini_Exists(arquivo)) << Verifica se NÃO existe, caso não exista ele executa o que está entre as chaves, no caso, dini_Create(arquivo) ou seja, se não existir ele criará, logo após vem uma sequencia de if, esses vão verificar se o cara é da PMilitar, caso seja ele salvará o cargo dele no dini com o nome de PMilitar, a mesma coisa pras organizações seguintes, se quiser aprender mais sobre dini procure outro tutorial no fórum e bendito seja o search.

Vou atualizar o tutorial depois, implementar, melhorar os códigos, explicar melhor etc, no momento estou ocupado então em breve estarei aqui com mais postagens construtivas.

Bom, é isso, tutorial meio corrido mas está ai, não pude explicar detalhadamente sobre alguns detalhes pois fugiriam do tema do tutorial como dini, strtok, variáveis enfim, QUALQUER duvida é só perguntar, se não tiver conseguindo montar seu código poste aqui.

Créditos: Josma_CMD
Agradecimento: Progressão Pawn

Progressão Pawn envolvendo jogadores revolucionando servidores.


Teleporte por OnPlayerSelectedMenuRow


Tutorial feito por Miqueias:

Um oláá da paraiba '-'

Estou aqui novamente postando um tutorial de como criar um teleporte por OnPlayerSelectedMenuRow, vejo muitos aqui no fórum mais por dialog, então vamos ser diferente, vamos fazer por OnPlayerSelectedMenuRow, então vamos lá...

De primeira logo vamos definir uma variável no topo do GM/FS

1
2
3
4
new Menu:MiqueiasGato;
  
new Menu // Vai indicar que você vai iniciar um Menu em Row
MiqueiasGato // Isso vai fazer funcionar sua Row, e também é porque sou gato mesmo '-'

Depois em OnGameModeInit vamos adicionar o que vai exibir o Menu quando usar o comando...

1
2
3
4
5
6
7
8
9
10
11
MiqueiasGato = CreateMenu("~g~Titulo do ~r~Tele", 1, 50.0, 180.0, 200.0, 200.0);
AddMenuItem(MiqueiasGato, 0, "TELE 1");
AddMenuItem(MiqueiasGato, 0, "TELE 2");
AddMenuItem(MiqueiasGato, 0, "TELE 3");
AddMenuItem(MiqueiasGato, 0, "TELE 4");
AddMenuItem(MiqueiasGato, 0, "TELE 5");
AddMenuItem(MiqueiasGato, 0, "TELE 6");
AddMenuItem(MiqueiasGato, 0, "TELE 7");
AddMenuItem(MiqueiasGato, 0, "TELE 8");
AddMenuItem(MiqueiasGato, 0, "TELE 9");
AddMenuItem(MiqueiasGato, 0, "TELE 10");

MiqueiasGato // Já foi dito acima
CreateMenu // Significa que vai criar um Menu em Row
AddMenuItem // Adiciona um Item na Lista do Menu, no caso uma linha
0 // Muito se pergunta porque aquele 0 alí Dai eu falo, ele direciona para os lados 0 = Esquerdo // 1 = Direito

1
2
3
4
5
6
7
8
9
10
Agora em OnPlayerCommandText
  
if (strcmp("/teleporte", cmdtext, true == 0)
{
     ShowMenuForPlayer(MiqueiasGato,playerid);
     TogglePlayerControllable(playerid,0);
     SendClientMessage(playerid, -1, "[INFO] Escolha o lugar pra onde você quer ir!!!");
     return 1;
  
}

Isso não precisa explicar que não tem nada de difício ai :S

Agora em OnPlayerSelectedMenuRow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
new Menu:current;
current = GetPlayerMenu(playerid);
if(current == MiqueiasGato)
{
    switch(row)
    {
        case 0:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 1:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 2:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 3:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 4:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 5:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 6:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 7:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
        case 8:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
         case 9:
        {
            print("Mensagem aparecerá no LOG!! // MiqueiasBarros Gostoso '-'");
            //resto do código
        }
    }
}

if(current == MiqueiasGato) // Vai buscar a variável que foi criada no topo para indentificar qual irá ser a dialog
case 0: // Ele tem que iniciar em 0, se for iniciar em 1 não irá funcionar nada...

FIM

É só isso aê pessoal, e por aí vem mais tutoriais... Só lembrando, quem tiver dúvidas ou não estiver entendendo por favor, comente aqui que irei ajuda-lo ok?

Até a próxima!

Créditos: MiqueiasBarros



Tutorial Arquivos no SA-MP


Cabritos, para este tutorial vamos usar a include "DINI"
Você poderá baixar no fim do post...


vamos criar um arquivo...
1
dini_Create("HomeHots.txt");
o arquivo HomeHots.txt será criado dentro da pasta scriptfiles


remover um arquivo
1
dini_Remove("HomeHots.txt");

o arquivo será deletado da pasta scriptfiles...


verificar se um arquivo existe:
1
if(dini_Exists("HomeHots.txt")) SendClientMessage(playerid, -1,"O arquivo existe!");
1
if(!dini_Exists("HomeHots.txt")) SendClientMessage(playerid, -1,"O arquivo não existe!");
--------------------------------------------------------------------------


salvar uma string no arquivo "texto"


dini_Set("HomeHots.txt","ronaldo","HomeHotsWona");
no arquivo vai ficar assim:


1
ronaldo=HomeHotsWona
o valor do ronaldo é o HomeHotsWona...


vamos pegar o valor da string...


1
new stringHTS[128] = dini_Get("HomeHots.txt","ronaldo");
o valor da stringHTS vai ser o que está após o "= <- igual" do ronaldo que nesse caso é HomeHotsWona


--------------------------------------------------------------------------


vamos salvar um valor numerico... "int"


1
dini_IntSet("HomeHots.txt","hts",123);
no arquivo vai ficar assim:


1
hts=123
o valo do hts é 123...


vamos pegar o valor do hts...


1
new valorhts = dini_Int("HomeHots.txt","hts");
o valorhts vai pegar o valor do hts no arquivo...


ficaria como


1
new valorhts = 123;
--------------------------------------------------------------------------


agora vamos salvar uma cordenada... "Float"


1
2
new Float:cabrito = 123.444;
dini_FloatSet("HomeHots.txt","cord",cabrito);
o valor 123.444 vai ser salvo...
no arquivo ficará assim:
1
cabrito=123.444
agora pegando o valor do cabrito no arquivo


1
new Float:lol = dini_Float("HomeHots.txt","cord");
a variavel float "lol" vai ter o valor 123.444



Clique aqui para fazer o download!
Créditos: DracoBlue
Tutorial: KevinsL




Tutorial Break / Continue
Continuação do tutorial de Loop!

Tutorial feito pelo cabrito -> Josma


Break
Break's são usados em Loop's, podendo parar o processo do mesmo.
loop faz uma conta rápida de um numero a outro, exemplo: de 0 a 500, com o Break você poderá parar essa conta em qualquer numero entre 0 e 500...


Exemplo:


1
2
3
4
5
6
7
8
9
10
new string[20];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(i == GetMaxPlayers())
{
format(string, sizeof(string), "Slots: {1E90FF}%d", i);
SendClientMessageToAll(Branco, string);
break;
}
}
Esse Loop vai fazer a conta de 0 a 500(que é o valor máximo de slots), porem, quando o (i) que é a variável criada no loop chegar ao numero máximo de slots(do servidor) ele irá formatar uma string e mandar uma mensagem para todos com o numero de slots do servidor. Após isso, irá parar o loop usando break.


Já se você mudar a ordem do código, colocando o format e o SendClientMessage fora das chaves do if que compara a variável do loop com o numero máximo de slots, ele terá um resultado diferente.


Exemplo de como ficaria o código:


1
2
3
4
5
6
7
8
9
10
new string[20];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(i == GetMaxPlayers())
{
break;
}
format(string, sizeof(string), "Slots: {1E90FF}%d", i);
SendClientMessageToAll(Branco, string);
}



No exemplo acima, ele não mandaria o resultado obtido e sim todos os resultados durante o progresso da conta, em um servidor de 3 slots por exemplo ele mandaria várias mensagems com a seguinte string:


0
1
2


Essa ordem ainda pode ser alterada, colocando o format e o SendClientMessage acima do if que contem o break, ficando assim:



1
2
3
4
5
6
7
8
9
10
new string[20];
for(new i = 0; i < MAX_PLAYERS; i++)
{
format(string, sizeof(string), "Slots: {1E90FF}%d", i);
SendClientMessageToAll(Branco, string);
if(i == GetMaxPlayers())
{
break;
}
}

O resultado nesse caso seria:


0
1
2
3
4
5


Continue
Da mesma forma que à uma função que pare um loop também à uma que faça ele continuar, e o nome é bem apropriado. continue. O continue pode ser usado para pular um ou mais numeros no loop, exemplo:



1
2
3
4
5
6
7
8
9
10
11
12
new string[20];
for(new i = 0; i < 5; i++)
{
if(i == 3)
{
continue;
}
format(string, sizeof(string), "Slots: {1E90FF}%d", i);
SendClientMessageToAll(Branco, string);
}
return 1;
}


Neste exemplo, estariamos fazendo a conta com o resultado máximo de 5(que supostamente seria o numero de slots) então, o continue faria o loop pular o numero 3, o resultado seria esse:


0
1
2
4


Para pular mais de um numero é simples, você só precisa usar operadores ">, &&, <"



1
2
3
4
5
6
7
8
9
10
11
12
new string[20]
for(new i = 0; i < 10; i++)
{
if(i > 3 && i < 7)
{
continue;
}
format(string, sizeof(string), "Slots: {1E90FF}%d", i);
SendClientMessageToAll(Branco, string);
}
return 1;
}

Neste caso, ele pularia após o numero 3 e antes do numero 7, tendo o resultado:




0
1
2
3
7
8
9


Bom, fiz este tutorial básico por que ao fazer a lista de tutoriais notei que não há nenhum tutorial sobre o assunto, apesar de ser uma coisa simples, por não haver muitos lugares com informações algumas pessoas não sabem que utilidade pode ter Break e Continue, então ai está =)




Loops
Introdução 
Loops são basicamente o que a palavra diz que eles são, é um pedaço de código que é criado para executar mais de uma vez. Assim, permite não perder tempo e mergulhar em que tipo de loops existem e como eles funcionam. 


Nota: Embora este tutorial é para pawn, loops se aplicam a praticamente todas as linguagens de programação na existência, ea sintaxe é quase sempre o mesmo! 


While 
O loop while é simples, ele verifica se a condição é verdadeira e ao mesmo tempo, é verdade, ele executa uma parte do código. Ele é usado para um loop que você não sabe quantas vezes você quiser que ele seja executado. Nós sabemos quantas vezes o laço será executado, neste exemplo, mas vamos usar um loop enquanto que para o propósito do exemplo:


-----------------------------
new var = 1;
while(var <= 5)
{
    printf("Valor de var é agora %d", var);
    var++;
}
print("o Loop While terminou");
-----------------------------


Então o que estamos fazendo aqui, está criando uma nova variável com um valor de 0. Então nós estamos fazendo um loop while que verifica se var for menor ou igual a 5, em seguida, executa a parte do código entre as chaves. A potência específica deste pedaço de código é: 


------------------------
Valor de var é agora 1
Valor de var é agora 2 
Valor de var é agora 3 
Valor de var é agora 4 
Valor de var é agora 5 
o Loop While terminou 
------------------------


Então, o que vemos aqui é que o loop correu 5 vezes e acabado. É entendimento pena que o loop irá parar a execução de qualquer outro código até que termine, já que esta é uma das principais causas de scripts unoptimized e mal codificadas.


Para loop 
O loop for é um laço que é para ser executado uma quantidade exata de vezes. Vamos fazer um exemplo simples para explicá-la: 


-----------------------------
for(new var = 1; var <= 5; var++)
{
    printf("Valor de var é agora %d", var);
}
print("Loop for concluído ");
-----------------------------


Então o que estamos fazendo aqui, está criando uma nova variável que só pode ser usado no circuito chamado "var", então estamos verificando se é menor ou igual a 5 e se for, executar o código dentro do curly suportes e var incremento de 1. A saída desse código é: 


-------------------------
Valor de var é agora 1
Valor de var é agora 2 
Valor de var é agora 3 
Valor de var é agora 4 
Valor de var é agora 5 
Loop for concluído 
-------------------------


Perceber nada? Bem, é a mesma saida que o loop while! Então é assim que você faria o mesmo loop em um loop for, é uma maneira muito melhor de se fazer este exemplo de código específico. O mesmo se aplica para este tipo de loop também, que vai adiar qualquer execução de outro código até que o loop é terminado a execução. 


Praticidade em SA-MP scripts 
Geralmente o loop principal usar as pessoas em SA-MP é o loop ea razão que eles usam este loop é para executar um pedaço de código em todos os jogadores no servidor, um exemplo típico: 


-----------------------------
for(new i; i < MAX_PLAYERS; i++)
{
    if(IsPlayerAdmin(i)) printf("ID %d é um admin", i);
}
-----------------------------


Esta simples pedaço de código será executado através de todos os do playerid no servidor e verificar se eles está logado como um administrador RCON, se forem, ele irá imprimir a sua ID no console. 



Bom como muita ta gente está me pedindo eu resolvi fazer um cod pro cara tomar ban assim que ele logar na rcon..
Ai eu fiz um completinho monstrando o nick do cara para o server assim que ele tomar...
Para utilizar basta colocar o código em baixo de seu GM.

OBS.: Caso queira que o cara leve Kick ao invés de Ban basta trocar " Ban(i); " por " Kick(i); "


public OnRconLoginAttempt()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
new lol[128];
format(lol, sizeof(lol),"%s um Player Mal Intencionado Tentou Logar na Rcon e se deu MAL!",GetName(i));
SendClientMessageToAll(-1,lol);
Ban(i);
return 0x01;
}
}



Créditos: Gabriel Duarte



public OnPlayerText(playerid, text[])
{
   SetPlayerChatBubble(playerid,text, Vermelho,50.0,5000);
   return true;
}


SetPlayerChatBubble - Para Aparecer a Mensagem
Playerid - Para o Player
Text - Para Chamar o Texto Que Ele Dijitou
Vermelho - A cor Que Irá Aparecer
50.0 - a Distancia
5000 - Quantos Segundos, ou Seja, 5 Segundos.


Resultado:



Créditos: Jonathan Feitosa


1 – Acesse www.forumeiros.com e clique em “criar um fórum grátis” que fica no lado direito da tela.




 
2 – Na tela seguinte, escolha o tema do seu fórum. Vamos escolher qualquer um, pois isto pode ser mudado posteriormente. Selecione o que você prefere e clique em continuar.



3 – Na página seguinte informe os dados do seu fórum. É necessário preencher um título, uma descrição, o endereço, o idioma, fuso horário, um email válido de contato e senha. No campo “endereço do seu fórum” escolha o “subdomínio” que preferir. A senha de acesso deve ser composta de números e letras. Marque o campo “aceito os termos e condições” e clique em continuar.

4 – Na tela seguinte, será possível ver algumas razões que podem tirar o seu fórum do ar para que o usuário fique ciente. Informe novamente a senha de acesso e clique novamente em continuar.

5 – Se você fez tudo direitinho, verá uma mensagem de confirmação informando que seu fórum foi criado com sucesso. Receberá também por email, as instruções para administrar o seu fórum grátis.
 


Como muitos tinham essa dúvida estou a postar aqui um tutorial/codigo de como se criar um chat- kill então lá vai, vá em
public OnPlayerConnect(playerid)
e adicione

e depois vá em public OnPlayerDisconnect(playerid,reason)
e adicione


e em public OnPlayerDeath adicione



OBS: OS CÓDIGOS SEMPRE TEM QUE FICAR ABAIDO DAS CHAVES "{"
PS: MEU PIRMEIRO TUTORIAL, DESCULPE PELOS ERROS DE DIGITAÇÃO 



Créditos:SuB_ZeRo0_ PELOS CÓDIGOS
 Lohran Pelo tutorial 


Bom Galera Estou aqui para encinar como tirar
O Bendito erro no GM BPS(POSTADO POR THIAGO_STREET).
Porem Fica com 3 warnings, Mais da pra compilar e jogar.
Quando Vocês compilarem vai dar o seguinte erro:



Agora Você ira na linha do erro que é 7906, Chegando Na Linha
Vai ser essa Linha:


Você ira colocar // na frente de toda essa linha como vai ficar:


Feito Isso Só é Compilar e Editar a Vontade.


Créditos: SprunT (TUTORIAL) Thiago_Street(POSTAGEM DO GM)


Explicação da Função : CreatePickup.


CreatePickup = Criar a Pickup.
Modelo = a Pickup Que Irá Aparecer ( Irei Escolher a I )
Spawn = ( Irei Colocar o 2 )
Corx = Coordenada X Da Onde a Pickup Ficará.
Cory = Coordenada Y Da Onde a Pickup Ficará.
Corz = Coordenada Z Da Onde a Pickup Ficará.
-1 = Virtual Word ( deixe -1 mesmo )



Explicando a Função : IsPlayerInRangeOfPoint







2.0 = Raio
Corx = Coordenada X
Cory = Coordenada Y
Corz = Coordenada Z

Veja Mais Em : http://wiki.sa-mp.com/wiki/IsPlayerInRangeOfPoint



Vamos Começar Agora.


Criando Entrada/Saida de Interiores Usando Pickup

Primeiramente, Vamos Definir Nossas 2 Pickups. Que Ajudará a Fazer o Player Entrar é Sair do Interior





Pronto, Vamos Prosseguir Para o Passo Número 2.
Definimos no Topo Nossas Pickups. Agora Vamos na Callback OnGameModeInit.





Ou Seja, as nossas pickups Defininas em Cima, Demos Uma Função a Elas.Agora Vamos Para o Passo Número 3.

Então Ao Ficar Em Cima da Pickup Com Nome " Entrada Pickup ", a Seguinte Função Será Chamada :

Na Callback OnPlayerPickUpPickup Bote a Função Que Será Chamada, Na Pickup de Entrada :




Resultado : Ao Ficar em Cima da Pickup "EntradaPickup" Ele Tele transportará o Player Para o Local Desejado, é Setará o Interior dele, Para Não Bugará.

Terminado o Passo 4. Faça a Mesma Coisa Com a "SaidaPickup".






Resultado : Ao Ficar em Cima da Pickup "SaidaPickup" Ele Tele transportará o Player Para o Local Desejado.

- Assim Podendo Criar Teleportes, Entradas, Saidas, Entre Outros.



Criando Entrada/Saida de Interiores Apertando F


Primeiramente. Vamos Ter que Fazer Nosso Comando.

- Na Callback OnPlayerCommandText Coloque Nosso Comando de Entrada/Saida.








Como Você Pode ver é Quase a Mesma Coisa. Só é Adicionada a Função IsPlayerInRangeOfPoint. Que Funcionará o Comando Apenas Naquele Local.
Agora Vamos Por Para Apertar F.


Na Callback OnPlayerKeyStateChange Coloque o Seguinte Código.





Então é Muito Fácil. é Com Isso Da Para Fazer Várias Coisas. Espero Que Tirado Uma Dúvida de Alguem.
Erros Avisar-me por MSN. > john_feat@hotmail.com


Créditos: >> Jonathan Feitosa <<


Irei Fazer um Tutorial, Ensinando Como Criar uma Simples Câmera, é Aprender a Usar as Funções:

SetPlayerPos(playerid, Corx, Cory, Corz);
SetPlayerInterior(playerid, Interior);
SetPlayerCameraPos(playerid, Corx, Cory, Corz);
SetPlayerCameraLookAt(playerid, Corx, Cory, Corz);

Como Pegar Coordenada

Vai no GM, Fique No Lugar Onde quer Pegar a Coodernada, Use /save, Ai Vai criar uma Ferramenta de Testo Chamada "savedpositions", Ai Tu Clicka Vai Aparecer : 

AddPlayerClass(1,1633.4465,1046.9131,11.2648,69.67 78, 26, 36, 28, 150, 0, 0);

X = 1633.4465
Y = 1046.9131
Z = 11.2648
ANGULO = 69.6778



Como Pegar Interior


No Local Onde Você Vai Criar a Câmera, Digite /interior, Que Aparecerá o Interior Onde Está.


Aprendendo a Lógica


Entre no Servidor, Escolha a Posição Onde Queria Pegar a Coordenada, Digite /save. O Primeiro /save é o da Coordenada Do SetPlayerCameraPos SetPlayerPos, Ou Seja o CameraPos Posiciona a Câmera, e o SetPlayerPosSeta o Player Junto Com Ele ( Caso Queira Que o Player Não Apareça, Abaixe a Coordenada Z Para -100).

SetPlayerCameraLookAt é Para Onde a Câmera Vai Olhar.



Como Criar Uma Câmera ( UM SIMPLES EXEMPLO QUE EU FIZ )


Primeiro, Entre no Servidor. Escolha o Local Desejado, Use /save Que é Para as Coordenadas SetPlayerCameraPos eSetPlayerPos.
Veja Abaixo Como Se Faz :




Em Seguida Ande 5 Passos Reto(Para Não da Erro) da Onde Você Pegou a Ultima Coordenada e Pegue a Coordenada Do SetPlayerCameraLookAt.
Veja o Exemplo Abaixo :




Com as Coordenadas Na Mão, Vá Pegar Elas Na Pasta Onde Fica a Pasta do Seu GTA, No Arquivo " savedpositions ".
Veja o Exemplo Abaixo :




Abra a Arquivo, Depois de Abrir Aparecerá as Coordenadas Que Você Pegou.
Veja o Exemplo Abaixo :






Ao Pegar Todas as Coordenadas, Vamos Passar Pro Pawn.
Veja Como Ficou Abaixo :




NOTA-SE QUE :

As Coordenadas SetPlayerCameraPos SetPlayerPos São Iguais.
Veja Que as Imagens Estão Baseada Em Um Exemplo. ( Que Eu Fiz ).



RESULTADO





Créditos : Jonathan Feitosa
Dúvidas? Ajudas ? MSN: john_feat@hotmail.com






Estou Me Apresentando, Eu Sou SprunTinhO, Postador da Homehots e moderador do xat.
Agora vamos ao assunto, SprunT Para que serve um banner? Serve Para Um Blog, forum e etc.
Bom Pessoal sao dois videos encinando ai voce quando assistir, depois irei postar mais downloads. Conteudo:



Download 56 Styles Boas Click Aqui.
Espero que ajude, Depois irei postar um tutorial mais dificil.

Créditos: SprunTinhO e HomeHots Exclusivo HTS.






Bom, Pra quem Não sabe, o Bug do Tunar é o seguinte, Você vai pega um carro, vai até a transfender ou outra lojinha, e quanndo entra para colocar as peças, você aperta enter e o player desce do carro.. você fica bugado e não sai mais de lá.

Como Arrumar:
na maioria das Vezes esse BUG se encontra no Comando "/sair", que ao digitar, remove o player do carro.
para arrumar isso é preçiso Definir um Local pra quando o player digitar /sair, Não Saia Do carro.

Como Fazer?

Vou Postar um Exemplo.



Ta ai,  Você Pode Adaptar outras coordenadas, Usando Também o "else if"
Até mais, Bom proveito ^^

Créditos: Andre_RoYal


Postagens Relacionadas

Proxima
« Anterior
Anterior
Proxima »
Tecnologia do Blogger.