Mostrando postagens com marcador Tutoriais. Mostrar todas as postagens
Mostrando postagens com marcador Tutoriais. Mostrar todas as postagens

[TUT] - Usando SSCANF em ZCMD


¤Usando sscanf em zcmd¤


  ZCMD é muito diferente de STRCMP, além de tudo é mais fácil de se aprender.

  Neste tutorial vamos ensinar como usar sscanf em zcmd.

  Para usar sscanf em zcmd terá que criar o comando zcmd logico, então vamos lá.

No topo do GM/Fs adicione

#include zcmd #include sscanf2

Então agora vamos criar um comando de mp

Não se esqueça de adicionar as arrays como logico, claro que pode mudar o nome, não é preciso chamar-se new Texto, pode ser new frase, o que quiser, só tem que saber colocar...

//=====[ARRAYS]====== new texto; new nome[MAX_PLAYER_NAME]; new Str[128]; new id;

CMD:mp(playerid, params[]) {     if(sscanf(params, "us",id,texto))     {         SendClientMessage(playerid,-1,"Use: /mp [id] [texto]");     }     else     {         if(IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "Este jogador não está conectado");         GetPlayerName(playerid,nome,sizeof(nome));         format(Str, sizeof(Str), "Mesangem Privada de %s: %s",nome,texto);         SendClientMessage(id,-1,Str);     }     return true; }

Bem vamos falar agora um pouco sobre o comando
if(sscanf(params, "us",id,texto))

if - Primeiramente. Para quê if? Simples. sscanf, quando consegue cumprir sua função, retorna 0 (O que é um costume desconhecido em pawn). Ou seja, quando ele separa a string corretamente e todas as variávels são preenchidas, retorna 0, caso contrário 1, o que mostraria a ajuda do comando. (Créditos Luís Miki)


params - Como você já sabe, no zcmd, params é o que vem depois do /comando. Ou seja, seu objetivo é quebrar a string 'params' para poder pegar a hora para setar o servidor. (Créditos Luís Miki)

us - Bem essa parte é o que torna sscanf facil de usar em zcmd, vc sabe quando usa mensagem que tenha que pegar o nome do player? ou o id, que usa %s, %d aqui é mesma coisa só que sem %, então vamos ver alguns dos que eu sei..
d ou i - usado quando você usa números, exemplo numero do seu celular...
s - é o string usado quando você usa letras, exemplo "Meu nome é BlueX"
u - usado para aquele famoso [Id do Player]...
f - usado para coordenadas...
Existem mais, mas nós ainda não estamos usando-os....
depois para acabar basta adicionar as arrays, você pode criar uma array chamada id, para o s você pode criar uma chamada Texto, por ai a diante...

SendClientMessage(playerid,-1,"Use: /mp [id] [texto]");
~> isso é aquela mensagem quando você só digita o comando, /mp dai aparece essa mensagem..
else
↓sscanf 2.0 - Clique Aqui
~> irá retornar caso você adicione o id e o texto exemplo ( /mp 1 eae. )




Por fim usamos:

format(Str, sizeof(Str), "Mesangem Privada de%s: %s",nome,texto);
Perguntas frequentes:
~> Não precisa adicionar o ID?
R= Não pois você irá mandar para o player não será necessário, mas caso você queira que mostre o id basta colocar assim:

format(Str, sizeof(Str), "Mesangem Privada de %s [ID%d]: %s",nome,playerid,texto);

Explicamos este comando todo, acho que agora aprenderam, então, vou exemplificar mais outros comandos

/av para admin:

CMD:av(playerid, params[]) {     if(IsPlayerAdmin(playerid))     {         if(sscanf(params, "s",texto))         {             SendClientMessage(playerid,-1,"Use: /av [texto]");         }         else         {             GetPlayerName(playerid,nome,sizeof(nome));             format(Str, sizeof(Str),"Admin %s [ID:%d]: %s",nome,playerid,texto);             SendClientMessageToAll(-1,Str);         }     }     else SendClientMessage(playerid,-1,"Você não esta logado na rcon");     return true; }

/a (chat de admins)
CMD:a(playerid, params[]) {     for( new i; i < MAX_PLAYERS; i++ )     {         if(IsPlayerAdmin(playerid))         {             if(sscanf(params, "s",texto))             {                 SendClientMessage(playerid,-1,"Use: /a [texto]");             }             else             {                 GetPlayerName(playerid,nome,sizeof(nome));                 format(Str, sizeof(Str),"%s: %s",nome,texto);                 SendClientMessage(i,-1,Str);             }         }         else SendClientMessage(playerid,-1,"Você não é adminRcon");     }     return true; }

Bem agora basta usar imaginação, você consegue fazer coisas mais rapidas com zcmd e sscanf.
Usando imaginação você chega lá. Espero que goste.


®Creditos®
®BlueX - Por criação do Tutorial
®Luis Miki - Por explicação de duas coisas que eu não sabia
®Y_Less - Pela criação do sscanf
®Zeex - Pela criação do zcmd

↓Download↓


[INC]zcmd .:> Clique aqui

[INC]sscanf2.0  .:> Clique aqui


[TUT] - Criando GangZones domináveis por CheckPoints

Iremos ensinar para vocês agora como criar GZ's dominaveis por Checkpoints.
As includes necessarias são as:
#include <a_samp> #include <cpstream>
Aconselho botar isso também no começo do seu Gamemode:
#pragma tabsize 0
Depois crie defines para definir as gangs:
#define SOLDADO 1 #define CHINES 2

Depois crie a forward para riar a public com as funções para dominar o territorio no CheckPoint:
forward ZoneCheckpointCheckerbyRangel();
Depois crie uma New com as cores das GZ's:
new gzcolor[3] = //2+1 = (3) pois tem 2 GZs... {     0x33AA33AA, 0xFF9900AA };
Crie uma variavel para definir as GZ's:
new cpzone[MAX_PLAYERS][3]; //2+1 (3) pois tem 2 GZs...
Depois crie novamente outra variavel:
new lastcp[MAX_PLAYERS];

Agora criando as GZ's:
new Soldado; new Chines;
Definindo os Checkpoints para dominar nelas:
new cpsoldado; new cpchines;

Agora em OnGameModeInit
coloque as skins:
AddPlayerClass(287,-1324.0948,497.2354,11.1953,137.1467,0,0,0,0,0,0);//Soldado AddPlayerClass(123,-2185.7253,706.9626,53.8906,225.8146,0,0,0,0,0,0);//Chines

Também em OnGameModeIni
coloque as GZ's:
Soldado = GangZoneCreate(-1753.477, 246.9049, -1007.979, 613.7866);  Chines = GangZoneCreate(-2379.232, 577.1168, -1988.689, 1489.569);

E também os ChecksPoints em OnGameModeInit.
Checkpoints (crie os checkpoints na mesma ordem das GZs, senão da erro na hora de conquistar)
cpsoldado = CPS_AddCheckpoint(-1371.5627,492.2494,11.1953,2.0,80); cpchines = CPS_AddCheckpoint(-2206.7749,701.3187,49.4375,2.0,80);

Novamente em OnGameModeInit
Coloque isso para definir as checks
#pragma unused cpchines, cpsoldado

Agora o RequestClass
Vamos criar esse basico aqui depois você modificade acordo com sua preferêcia:
if(classid == 0)//Isso define a posisao das skins no OnGameModeInit     {     Gang[playerid] = SOLDADO;     GameTextForPlayer(playerid,"~y~Soldado",6000,6);     SetPlayerInterior(playerid,3);     SetPlayerPos(playerid, -2669.8770,1410.3972,912.7240);     SetPlayerFacingAngle(playerid, 267.7684);     SetPlayerCameraPos(playerid, -2663.8770,1410.3972,912.7240);     SetPlayerCameraLookAt(playerid, -2669.8770,1410.3972,912.7240);     ApplyAnimation(playerid,"PED","WALK_DRUNK",4.0,1,1,1,1,0);     }     else if(classid == 1)//Isso define a posisao das skins no OnGameModeInit     {     Gang[playerid] = CHINES;     GameTextForPlayer(playerid,"~y~Chines",6000,6);     SetPlayerInterior(playerid,3);     SetPlayerPos(playerid, -2669.8770,1410.3972,912.7240);     SetPlayerFacingAngle(playerid, 267.7684);     SetPlayerCameraPos(playerid, -2663.8770,1410.3972,912.7240);     SetPlayerCameraLookAt(playerid, -2669.8770,1410.3972,912.7240);     ApplyAnimation(playerid,"PED","WALK_DRUNK",4.0,1,1,1,1,0);     }

OnPlayerRequestSpawn a cor das gangs:
if(Gang[playerid] == SOLDADO)     {     SetPlayerInterior(playerid,0);     SetPlayerColor(playerid, 0x33AA33AA); //Verde Claro     }     else if(Gang[playerid] == CHINES)     {     SetPlayerInterior(playerid,0);     SetPlayerColor(playerid, 0xFF00FFAA); //Rosa     }
Em public OnPlayerSpawn
As cores das GZs:
GangZoneShowForPlayer(playerid, Soldado, gzcolor[0]);     GangZoneShowForPlayer(playerid, Chines, gzcolor[1]);
Se for adicionr mais GZs.. ja sabe que tem que acompanhar os numeros "gzcolor[numero]"...



Na public OnPlayerLeaveCheckpoint
coloque isso:
new checkpointid = lastcp[playerid];     if(checkpointid > 0 && checkpointid <= 2) //são 2 checkpoints, então mude se for colocar mais...     {     cpzone[playerid][checkpointid] = 0; //saiu do CP...     GangZoneStopFlashForAll(checkpointid-1);     }

Agora a public que criandos a Forward  no inicio:
public ZoneCheckpointCheckerbyRangel() {     for(new i; i < MAX_PLAYERS; i++)     {         if(!IsPlayerConnected(i))continue;         if(CPS_GetPlayerCheckpoint(i) > 0 && CPS_GetPlayerCheckpoint(i) <= 2 &&             //são 2 checkpoints, então mude se for colocar mais...             gzcolor[CPS_GetPlayerCheckpoint(i)-1] != GetPlayerColor(i))         {             if(cpzone[i][CPS_GetPlayerCheckpoint(i)] < 30)             {                 cpzone[i][CPS_GetPlayerCheckpoint(i)]++;                 new tmp[10];                 format(tmp, sizeof tmp, "~w~%2d/30", cpzone[i][CPS_GetPlayerCheckpoint(i)]);                 GameTextForPlayer(i, tmp, 1001, 4);                 GangZoneFlashForAll(CPS_GetPlayerCheckpoint(i)-1, GetPlayerColor(i));             } else if(cpzone[i][CPS_GetPlayerCheckpoint(i)] == 30) //passou 30 segundos dentro do checkpoint             {                 GameTextForPlayer(i, "~w~Conquistado", 4000, 1);                 gzcolor[CPS_GetPlayerCheckpoint(i)-1] = GetPlayerColor(i);                 GangZoneStopFlashForAll(CPS_GetPlayerCheckpoint(i)-1);                 GangZoneHideForAll(CPS_GetPlayerCheckpoint(i)-1);                 GangZoneShowForAll(CPS_GetPlayerCheckpoint(i)-1, GetPlayerColor(i));//Ficar piscando a cor do player na GZ             }         }     } }
~> Fim
Créditos:  Link_

[TUT] - Criando organização

Í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).


Este não é um código útil e sim um tutorial, não (apenas) decore, leia, entenda e crie seu sistema.

Parte 1, criando suas organizações: Bom, iremos 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, iremos criar aqui 3 organizações como exemplo neste enum.
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, não colocamos, 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.

new PlayerInfo[MAX_PLAYERS][Info];

Como podem perceber acima criamos a variável PlayerInfo, o nome é de sua preferencia, esta variável tem o valor MAX_PLAYERS, ou seja, podemos 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 utilizamos 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.

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 estamos mostrando a mais simples para explicar sobre o 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...
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.

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.

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.

#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.
new VPMilitar[5];





Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:

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. Iremos usar a OnPlayerStateChange...

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á.

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.
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: Criamos 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.

[TUT] - State machines (automata)

State machines (automata)
O que é, para que serve e como usar
Introdução

Se você nunca leu a pawn lang, é quase 100% de certeza que não conhece state machines, ou automata.

State machines, ou automata, não foram feitos para serem usados como arrays, pois não podem possuir indexes, ou seja, você não poderá usar automata com fins de gerenciar as ações cada player, por exemplo.
 


[TUT] - Apredendo a indentar seus códigos


  • Identando seu código
    - Para Identar seu código são usados o TAB (que mostra score) e o espaço.
    Como é um código mal identado?

    vou postar um por exemplo:
    pawn Código:
    if(!strcmp(cmdtext,"/shith", true)){ if(IsPlayerAdmin(playerid)) { return 0; }     SendClientMessageToAll(-1,"[INFO]: Você está aprendendo algo aqui ?");  return 1; }
    /\ este comando você pode colocar no new do pawn e rodar, ele funcionará, mais dará os seguintes warning:
    Código:
    - Loose Identation
    Posso resolver isto muito bem colocando #pragma tabsize 0 no topo? 
    RE: não, assim você não aprenderá o realmente pawn, pode aprender, mais ficará mais dificil de intender seus próprios códigos.
    isto não aconselho há ninguém.



  • Como posso fazer uma boa identação ?
    bom para ter uma boa identação será necessário você ter algum editor de programação, (pawno, notepad++ entre outros)
    até o bloco de notas do windows serve, mais nele você não vai ter a mesma noção de espaço do que os editores.

    vou identar o código acima, veja a diferença:
    pawn Código:
    if(!strcmp(cmdtext,"/shith", true)) {     if(IsPlayerAdmin(playerid))     {         return 0;     }     SendClientMessageToAll(-1,"[INFO]: Você está aprendendo algo aqui ?");     return 1; }

    /\ o Código alem de bonito, ficou mais legível, dá para você entender.

    caso não itendeu nada de útil, vamos a explicação:

    Árvore identalógica
    pawn Código:
    |     |         |             |                 |                     |                         |                             |                                 |                             |                         |                     |                 |             |         |     | |


    todos os códigos seguem este padrão (a maioria).

    caso não itendeu novamente vamos dinovo:

    Árvore Identalógica ( EM FORMATO DE PAWN )
    pawn Código:
    if(parametros /* Sinal */ parametros) {     if(parametros /* Sinal */ parametros)     {         if(parametros /* Sinal */ parametros)         {             if(parametros /* Sinal */ parametros)             {                 if(parametros /* Sinal */ parametros)                 {                     if(parametros /* Sinal */ parametros)                     {                         if(parametros /* Sinal */ parametros)                         {                         }                     }                 }             }         }     } }

    NOTA: este código não funciona, foi usado com o um exemplo.

  • FAQ - Perguntas Frequêntes
    Existe algum site que faz isto de graça?
    RE: Sim, ele existe, ele e iPs Tidy.

    Porque devo começar a identar meus códigos ?
    RE: Amigo, a identação não é obrigatória, mais caso você queira seguir no rumo
    de programador, terá que aprender o básico, ou seja, aprender a identar.

    Créditos
    [iPs]Garfield
    [iPs]RedJohn