Tuyo

Fazer download em txt, pdf ou txt
Fazer download em txt, pdf ou txt
Você está na página 1de 6

Boas, partindo de um tutorial do Emmet que vi na board Inglesa, decidi fazer um

para a board portuguesa, com o objetivo de

ver os utilizadores desta board com melhores scripts e melhores l�gicas de


programa��o.

[color=red][font=Courier New]Problema do strtok[/font][/color]

[list]Bem, vejo ainda muitos membros desta board,a usar a "velhinha" strtok feita
pelo DarcoBlue.

[size=2][color=red][b][u][color=green][url="http://wiki.sa-mp.com/wiki/
Strtok"]Fun��o strtok:[/url][/color][/u][/b][/color][/size]

[pawn]strtok(const string[], &index)


{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}

new offset = index;


new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) <
(sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}
[/pawn]

Mas, n�o sabem que ela al�m de ser velha � tamb�m lenta em rela��o a atuais
comparadores de par�metros.
Bem, eu recomendo que usem [url="http://forum.sa-mp.com/showthread.php?
t=120356"]sscanf[/url] criada pelo [url="http://forum.sa-mp.com/member.php?
u=29176"]Y_Less[/url], n�o s� pela facilidade de uso, mas tamb�m pela velocidade
desta e n�o s�;

[SIZE="1"][b]Vejam a diferen�a do comando /kick [id]:[/b][/SIZE]

[size=1][color=red][b][u][color=green]Em strtok[/color][/u][/b][/color][/size]
[pawn]
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[128], idx;
cmd = strtok(cmdtext, idx);

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


{
new tmp[128];
tmp = strtok(cmdtext, idx);

if(strlen(tmp) == 0)
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick
[playerid]");

Kick(strval(tmp));
return 1;
}
return 0;
}

[/pawn]

[size=1][color=red][b][u][color=green]Em sscanf[/color][/u][/b][/color][/size]
[pawn]
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmd, "/kick", true) == 0)
{
new id;
if(sscanf(cmdtext, "u", id))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick
[playerid]");

Kick(id);
return 1;
}
return 0;
}
[/pawn]

Viram? Os comandos acima fazem exatamente o mesmo, por�m como podem ver, a sua
elabora��o � diferente, pessoalmente acho que � sem d�vida o segundo, mais f�cil
que o primeiro.[/list]

[SIZE="2"][color=red][font=Courier New]Problema do uso de strcmp para criar


comandos[/font][/color][/SIZE]

[list]Bem, ainda muito usam strcmp para criar comandos. Isto atualmente normalmente
diz muito sobre o programador do GM, ou � pregui�oso e n�o quer atualizar os seus
comandos para processador de comandos, ou, usa um gamemode da Internet e n�o faz a
m�nima ideia do que � um processador de comandos (embora atualmente tenha mais
gamemodes na internet com processador de comandos). Antes de tudo strcmp tem como
finalidade comparar string's e nao criar comandos.

Usar um processador de comandos tem enormes vantagens, como a maior simplicidade na


cria��o de comandos, � pr�tica, c�modo e sobretudo mais r�pido de usar do que
strcmp.

Analisem o comando [b]/kick [id][/b] abaixo:

[size=1][color=red][b][u][color=green]Em strcmp (N�o � processador de


comandos)[/color][/u][/b][/color][/size]
[pawn]public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmd, "/kick", true) == 0)
{
new id;
if(sscanf(cmdtext, "u", id))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick
[playerid]");
Kick(id);
return 1;
}
return 0;
}[/pawn]

[size=1][color=red][b][u][color=green]Em zcmd (Processador de comandos)[/color][/u]


[/b][/color][/size]
[pawn]CMD:kick(playerid, params[])
{
new id;
if(sscanf(params, "u", id))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
Kick(id);
return 1;
}[/pawn]

[size=1][color=red][b][u][color=green]Em ycmd (Processador de comandos)[/color][/u]


[/b][/color][/size]
[pawn]YCMD:kick(playerid, params[], help)
{
#pragma unused help
new id;
if(sscanf(cmdtext, "u", id))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
Kick(id);
return 1;
}
[/pawn]

Viram a diferen�a?

� muito melhor n�o �? Eu sei que sim...

E sim criar comandos com processadores de comandos nao precisa de colocar o comando
dentro de qualquer callback.

Tambem [U]muitas vezes nao precisam criar variaveis[/U], assim:

[size=1][color=red][b][u][color=green]Em zcmd[/color][/u][/b][/color][/size]
[pawn]CMD:kick(playerid, params[])
{
if(sscanf(params, "u", params[0]))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
Kick(params[0]);
return 1;
}[/pawn]

[size=1][color=red][b][u][color=green]Em ycmd[/color][/u][/b][/color][/size]
[pawn]YCMD:kick(playerid, params[], help)
{
#pragma unused help
if(sscanf(cmdtext, "u", params[0]))
return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
Kick(params[0]);
return 1;
}
[/pawn][/list]
[list][url="http://forum.sa-mp.com/member.php?u=29176"]Y_Less[/url], n�o s� pela
facilidade de uso, mas tamb�m pela velocidade
[/list]

Porque escolhi ycmd e zcmd?

-Porque s�o os mais r�pidos (apesar de ycmd ser o mais r�pido), j� criados em pawn
atualmente e s�o os que a maioria dos programadores de sa-mp que usam processadores
de comandos usam.
Sim, eu sei que ainda existem mais r�pidos desenvolvidos em C++, por�m s�o mais
complexos o seu uso para quem ainda est� a aprender, porque mexe com plugins, etc.
[/list]

[color=red][font=Courier New]E se eu usar sscanf e um processador de comandos,


estou a agir bem?[/font][/color]

[list]Bem isso � o ideal e sim est� a agir corretamente, por�m para quem n�o est� a
usar a e quer come�ar, deixo aqui uns links de uns tutoriais para come�arem.[/list]

[list][list]ycmd e sscanf: http://forum.sa-mp.com/showthread.php?


p=2671917#post2671917[list][list]

[list][list]zcmd e sscanf: http://forum.sa-mp.com/showthread.php?t=329507[list]


[list]

[list]Deixo tamb�m o t�pico oficial aqui no F�rum SA-MP de cada processador e da


SSCANF:

[list][list]ZCMD: http://forum.sa-mp.com/showthread.php?t=91354[list][list]
[list][list]YCMD: http://forum.sa-mp.com/showthread.php?t=169029[/list][/list]
[list][list]SSCANF: http://forum.sa-mp.com/showthread.php?t=120356
[/list][/list]

[/list]
LOOPS:

- A maioria tem por norma fazer os loops assim:

[PAWN] for(new i = 0; i < MAX_PLAYERS; i++)


[/PAWN]

-N�o � que esteja errado, por�m podem fazer com que os loops tenham um
processamento (velocidade) maior, como?

Fazendo-os assim: [PAWN]for(new i = 0, j = GetMaxPlayers(); i != j; i++)


[/PAWN]

Qual a diferen�a?

-No outro toma como valor de objetivo o MAX_PLAYERS que para quem n�o sabe est�
definido por default pela SA-MP Team na Include a_samp.inc como valor padr�o 500 (a
n�o ser que seja um "pacote" de 1000 players), ou seja, ir� sempre realizar o loop
de 500, ao contr�rio do outro que vai obter o valor m�ximo de players que podem
entrar no servidor (valor que fica no server.cfg) e faz o loop desse valor como o
valor de slots da maioria dos membros aqui na board portuguesa quase nunca � 500,
este tipo de loop � muito mais r�pido que o outro;

-Por�m, tamb�m pode continuar a usar o mesmo tipo de loop e torna-lo mais r�pido,
simplesmente alterando o valor do MAX_PLAYERS que o seu servidor t�m, assim:

-Com este simples code acima, vo�� j� ganha processamento, contudo pode ainda
melhorar mais recorrendo ao uso da include foreach, criada pelo
[url="http://forum.sa-mp.com/member.php?u=29176"]Y_Less[/url].

L�GICAS SEM L�GICA:

- Ao ler o t�tulo, oassunto � engra�ado , por�m o assunto � s�rio por vezes, ve-se
os c�digos assim:

-Quando me deparo com um c�digo deste, pergunto se n�o seria mais f�cil faze-lo
assim:

-Com isto vejo que muitos membros ainda n�o sabem os operadores l�gicos, se � que
ao menos sabem que eles existem, por isso decidi deixar aqui alguns links de
tutoriais de operadores l�gicos, para quem quiser saber mais sobre este assunto.

- Es+ero que aprendam algo com este tutorial, se quiserem acrescentar algo ou
melhorar o tutorial em algum aspeto, estejam � vontade.

-Talvez no futuro, dependendo do vosso feedback, melhorarei ou farei mais


tutoriais, deixem abaixo as suas opini�es, tambem se tiverem em d�vida acerca de
algum assunto deste tutorial, estarei � disposi��o para responder.
-Sei que o tutorial � acerca de uma mat�ria simples, por�m muitos ainda nunca se
aperceberam ou nunca viram a vantagem de "evoluir" os seus scripts, talvez com isto
aprendam algo.

Você também pode gostar