zcmd + sscanf's how to -
steki. - 15.07.2011
Primeiramente eu gostaria de agradecer ao moderador do forum PT/BR que parece que fica o dia inteiro no forum do SAMP e pфde apagar meu post fail. Minhas sinceras desculpas
zcmd + sscanf's how to
Pra que usar ZCMD? E pra que sscanf? Vou falar nesse tutorial porque e como
usar!
Zcmd: Qual a diferenзa entre isso e strcmp.
Bem, quando vocк digita um comando, usando strcmp, se vocк tem, por exemplo, 500 comandos e o ъltimo for /teta. Se vocк digitar /teta, vai executar 500 strcmp, o que й meio idiota. Zcmd usa um mйtodo tipo 'hook' ou seja, digitou, jб chama a funзгo do comando.
sscanf: Qual a diferenзa entre isso e strtok?
Bem, na verdade eu nгo sei e nem quero saber. Sу sei eu caн de uma espaзonave. Sйrio. Nunca tentei aprender strtok, mas tenho certeza que sscanf й bem mais fбcil e versбtil.
ZCMD
Um breve exemplo: comando /pular.
pawn Код:
CMD:pular( playerid, params[] )
{
// params[] nгo usado
SetPlayerPos( playerid, 0.0, 0.0, 20000.0 );
return true;
}
Nуs temos CMD:pular( playerid, params )
O que vem depois da tag CMD: й o comando que o player digitar, mas sem a barra '/'.
Isso й modificado no compilador pois й uma macro, entгo tome cuidado com espaзos indevidos!
playerid - A ID do player que
Digitou o comando /pular
params[] - Tudo o que o player digitou depois do comando MAIS um espaзo. Ou seja, o espaзo nгo estб contido no params[]
RETURN
Quando criando um comando, retornando
true, significa que o comando foi passado ao player e nгo houve problema algum. Retornando
false, dependendo de uma callback que eu mostrarei daqui a pouco, mostrarб a clбssica mensagem: SERVER: Unknown Command.
Callbacks //gay -n
OnPlayerCommandReceived(playerid, cmdtext[])
Essa callback й chamada quando um player digita um comando, mas ANTES de executб-lo.
Ai vocк me pergunta com cara de bahiano arretado (sem preconceito) Eae tio, comofas// Pra que que serve saporra?
Bem. Se vocк estб codando um GM de RPG, como eu e usa arrays normais para guardar status do player, deve saber que, se um admin deslogar e um player tiver na login box com o mesmo id que ele vai ter os comandos de admin nй?
Pra nгo ter que fazer um trabalho de peгo (sem discriminaзгo) de colocar um check pra ver se o Player tб logado em CADA FRAKKIN' comando. Faзa isso: (OBS: isso й um exemplo. Um segredo que fica entre nуs й pra silenciar ele tbem hihi ^^ )
pawn Код:
public OnPlayerCommandReceived(playerid, cmdtext[])
{
if( GetPVarInt( playerid , "Logado" ) == 0 )
{
SendClientMessage( playerid , 0xCACACAFF , "Vocк precisa logar primeiro!" );
return false;
}
else
return true;
}
OnPlayerCommandPerformed(playerid, cmdtext[], success)
Essa tambйm й muito boa, por exemplo, se vocк quiser colocar uma mensagem de comando desconhecido customizada.
Essa callback tambйm й chamada quando um player digita um comando, mas, apуs dele fazer isso. Com o parвmetro sucess, que nada mais significa
o que vocк retornou no comando ^^. Lembra?
Exemplo:
pawn Код:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if( !success )
{
new msg[180];
format( msg, 180, "{FFA200}TERRA:{FFFFFF} Comando: {FFA200}%s: {FFFFFF}Este comando nгo existe ou vocк nгo tem permissгo para usб-lo", cmdtext );
SendClientMessage( playerid, -1, msg );
SendClientMessage( playerid, -1, "{FFFFFF}Para ter ajuda, digite {FFA200}/ajuda{FFFFFF} para ver os comandos, ou {FFA200}/suporte{FFFFFF} para falar com um dos testers online" );
}
return 1;
}
Lembrando que se vocк nгo usar essas callbacks vai ficar a mesma merda. Ou seja, nгo vai interfirir no seu GMzinho da Homehots // lawl
SSCANF, nigguh
Sйrio. Essa merda й o que hб. Quando se fala em velocidade e versatilidade, sscanf domina atб o cu do conde y.y.
Vocк pode usar isso desde em comandos em zcmd, como, se vocк nгo percebeu, estamos fazendo agora, atй consultas em mysql.
let us go.
sscanf( fonte, "formataзгo", destino1, destino2, destino3... );
Vou comeзar com um breve exemplo de comando.
pawn Код:
{
if( getPlayerAdminLevel(playerid) > 2 )
{
new hora;
if( sscanf( params , "d" , hora ) )
{
SendClientMessage( playerid , -1 , "{C2C2C2}AdmCmd: /setarhora [hora]" );
}
else
{
SetWorldTime( hora );
new msg[180];
format( msg , 180 , "AdmCmd: %s(%d) acaba de setar a hora do servidor para (%d)" , getPlayerName( playerid , true ) , playerid , hora );
adminWarning( msg );
}
return 1;
}
else
{
return 0;
}
}
O que temos aqui, й o comando mais simples do meu
GM. Ele apenas seta a hora do servidor. Observem:
if( sscanf( params ,
"d" , hora ) )
if - Primeiramente. Pra 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.
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.
"d"- Aiai, a parte mais divertida.
Vocк lembra no format ou no printf que agente tem que colocar %d ou %s para inserir a variбvel na linha de texto? Isso igual, mas ao contrбrio. Vocк nгo precisa usa '%'.
Quote:
d, ou i, como vocкs jб sabem, significa INTEGER, ou nъmero inteiro. Ou seja. o sscanf vai extrair um nъmero da string. AAAAAAAAAAAAAAH entendeu? Mais alguns exemplos:
s - extrai uma string
f - float
u - Uma mбgica. o u, minъsculo, й bem interessante, pois se vocк estб tanto como uma string ou um nъmero inteiro na string, ele retorna o playerid. Й o famoso [id/ParteDoNome]. Ou retorna 65535, IsPlayerConnected deve ser ultilizado nesses casos. Um breve exemplo:
pawn Код:
sscanf( params, "u", player );
Existem mais. Vб para link
|
MAS PERA AE MLK. SE EU QUISЙ MAI ALGUM PARMATROW AEW TIOW?
Simples. Se vocк quiser mais parвmetros, apenas coloque mais uma formataзгo.
pawn Код:
if( sscanf( params , "ud" , player , level ) )
Mas, pera ai. Como assim ele 'separa' a string? Como ele descobre o que eu quero?
Simples. sscanf, por padrгo separa as strings por espaзo. Ou seja. Os dados serгo quebrados de espaзo em espaзo, para facilitar nossa vida.
Mas se eu quiser dar um fetch row e separar a string com, por exemplo '|'?
Simples tambйm.
Use um especificador assim "p<DELIMITADOR AQUI>" Exemplo.
pawn Код:
if( sscanf( buff, "p<|>s[50]s[70]s[50]s[50]", sql_host, sql_user, sql_pass, sql_db ) )
Lembrando que vocк pode usar todos esses especificadores como u, d, p, em ordens diferentes ao seu gosto.
Sу um lembrete: Quando for usar string, coloque depois do s[FIELDS], como o exemplo acima, para nгo dar nenhum warning.
Isso й o bбsico para fazer comandinhuz super legais para seu GM editado da Homehots //lol again.
SE EU TE AJUDEI, OU VOCК PERCEBEU QUE EU DIGITEI BASTANTES CARACTERES, NВO CAI O DEDO DAR UM REPUTATION ^^
Eu sei que isso estб meio incompleto. Estarei respondendo dъvidas aqui mesmo, ^^
Re: zcmd + sscanf's how to -
RockFire - 15.07.2011
Muito bom Miki ^^ eu uso zcmd e sscanf mas essa do delimitador eu queria aprender agora entendi ^^
Sу pra complementar aqui a lista completa dos formatos para o sscanf, tirei do tуpico do sscanf
Код:
Format Use
L(true/false) Optional logical truthity
l Logical truthity
B(binary) Optional binary number
b Binary number
N(any format number) Optional number
n Number
C(character) Optional character
c Character
I(integer) Optional integer
i Integer
D(integer) Optional integer
d Integer
H(hex value) Optional hex number
h Hex number
O(octal value) Optional octal value
o Octal value
F(float) Optional floating point number
f Floating point number
G(float/INFINITY/-INFINITY/NAN/NAN_E) Optional float with IEEE definitions
g Float with IEEE definitions
{ Open quiet section
} Close quiet section
P<delimiter> Invalid delimiter change
p<delimiter> Delimiter change
Z(string)[length] Invalid optional string
z(string)[length] Deprecated optional string
S(string)[length] Optional string
s[length] String
U(name/id) Optional user (bot/player)
u User (bot/player)
Q(name/id) Optional bot (bot)
q Bot (bot)
R(name/id) Optional player (player)
r Player (player)
A<type>(default)[length] Optional array of given type
a<type>[length] Array of given type
E<specification>(default) Optional enumeration of given layout
e<specification> Enumeration of given layout
'string' Search string
% Deprecated optional specifier prefix
Re: zcmd + sscanf's how to -
steki. - 15.07.2011
Vlw
Re: zcmd + sscanf's how to -
[R] ousenber [K] - 15.07.2011
Eu prуprio uso zcmd com sscanf, pela facilidade e rapidez (:І
Esse nigoso de strtok ta com nada ! ZCMD e sscanf ta com tudo! kkk
__________________________________________
...Meus Trabalhos...
[
FisterScripts]
Sistema de Admin e Helper Simples
Sistema de Viagem v0.5
[
Includes]
Nenhum...
[
GameModes]
Nenhum...
[
Tutoriais]
Nenhum...
[
Maps]
W.D.A. ( Water Dylan Airport )
Se meu post lhe ajudou , lhe deixou confuso Clique nesta imagem >>
<< abaixo do meu avatar
Estou de Olho em vocк !
[Ass] Assinatura feita por JORGE_HARD
Re: zcmd + sscanf's how to -
RockFire - 15.07.2011
Quote:
Originally Posted by Luнs Miki
Bem, quando vocк digita um comando, usando strcmp, se vocк tem, por exemplo, 500 comandos e o ъltimo for /teta. Se vocк digitar /teta, vai executar 500 strcmp, o que й meio idiota. Zcmd usa um mйtodo tipo 'hook' ou seja, digitou, jб chama a funзгo do comando.
|
ri nessa parte
Re: zcmd + sscanf's how to -
Ricop522 - 15.07.2011
Gostei pra caramba do tуpico ^^
Bom trabalho, +reputation
Re: zcmd + sscanf's how to -
steki. - 15.07.2011
pawn Код:
CMD:teta( playerid, params[] )
{
new tetado;
if( sscanf( params, "u", tetado ) && IsPlayerConnected( tetado ) )
{
SendClientMessage( playerid, COLOR_PINK, "GayCmd: /teta [id/ParteDoNome]" );
}
else
{
GameTextForPlayer( player, "~r~~h~~h~VOCE FOI ENTETADO", 99999*99999, 1 );
SendClientMessage( playerid, COLOR_PINK, "GayCmd: Sua mensagem foi mandada ao mundo colorido" );
}
return true;
}
Re: zcmd + sscanf's how to -
Shadoww5 - 15.07.2011
PHP код:
CMD:comando(playerid, params[])
{
new str[128];
if(sscanf(params, "s[128]", str))
format(str, sizeof str, "%s", str);
SendClientMessage(playerid, 0xFFFF00FF, str);
return 1;
}
Quando eu digito /comando [PARAMETROS], eu recebo a mensagem
я.
Mas quando eu este abaixo a mensagem й enviada corretamente.
PHP код:
CMD:comando(playerid, params[])
{
new str[128];
if(sscanf(params, "s", str))
format(str, sizeof str, "%s", str);
SendClientMessage(playerid, 0xFFFF00FF, str);
return 1;
}
Luнs Miki, poderia me responder por quк ?
OBS: Isto foi sу um exemplo para eu nгo ter que postar o comando todo aqui.
Re: zcmd + sscanf's how to -
steki. - 15.07.2011
pawn Код:
CMD:comando( playerid, params[] )
{
new str[128];
if( sscanf( params, "s[128]", str ) )
{
// Cmd: /comando [params]
}
else
{
new str2[128];
format( str2, 128, "%s", str );
// SendClientMessage
}
}
o if estб errado
Re: zcmd + sscanf's how to -
Shadoww5 - 15.07.2011
Quote:
Originally Posted by Luнs Miki
pawn Код:
CMD:comando( playerid, params[] ) { new str[128]; if( sscanf( params, "s[128]", str ) ) { // Cmd: /comando [params] } else { new str2[128]; format( str2, 128, "%s", str ); // SendClientMessage } }
o if estб errado
|
Han ? Qual й o erro ?