Ir para conteúdo
  • Cadastre-se

Talkaction com multiplos parâmetros


Posts Recomendados

Tutorial - Talk Actions com multiplos parametros - String Explode e Patterns

Introdução:

Embora muitos ja saibam, e não há dificuldade nisso, muitos se perguntam: "Como eu faço uma talkaction com mais de uma virgula?".

Pergunta comum esta é, e ela se da geralmente entre os iniciantes. Se voce não for um, esse tutorial não é para você, mas sera para mim uma honra sua atenção.

Nesse tutorial, vou ensinar dois meios faceis e simples de fazer isso. Embora os iniciantes tenham mais esse tipo de dúvida, o conteudo é no minimo, Intermediario.

I - Informações

No Open Tibia tradicional, em termos de Talkaction temos um padrão simples de parâmetro, Cid (Creature Identification), que é quem fala, Words (palavras) que são as palavras que fala, Param (parametros, de vez enquanto voce ve uma talkaction que é so uma palavra, como !aol, mas nem sempre é assim), que é o adicional, que NÃO ESTÁ DEPOIS DA VIRGULA, e Channel, que é o canal em que o jogador fala.

Essas quatro funções nos permitem procriar sofisticadas funções, mas muitas vezes não é o necessário , e pessoalmente falando, não chega nem perto de sua capacidade.

Assim surge a necessidade de parâmetros multiplos.

II - STRING.EXPLODE

É o primeiro método, e o mais facil. O string.explode é armazenado em uma variavel, e sua sintaxe é a seguinte:


p = string.explode(STRING, "*")

Explicação: p é o nome da variavel, no meu caso, é abreviatura de PARAM. STRING é a string que a função vai operar, e na talkacion normalmente é param. * é com que elemento a função vai operar, geralmente é uma virgula "","", mas pode ser outros, como por exemplo, espaço. Agora vamos aos exemplos.

function onSay(cid, words, param) -- Repare que omiti Channel, que não usarei.

local p = string.explode(param, ",")

if p[1] and p[2] then

doPlayerAddItem(getPlayerByName(p[1]), p[2], 1)

return 1

end

return 0

end 

Vamos entender com o algoritimo:

função ná fala (quem falou, palavras que usou, parametros que usou)

p = string.explode(param, ",")

se existe o primeiro parametro e o segundo parametro então

adicionar ao jogador correspondente ao nome do parametro, o item do segundo parametro na quantidade 1

fim

fim

OBS: omiti coisas que não tem impotancia com o assunto


Obs.: p é abrevitura de param (parâmetro).

Ainda não entendeu? Entao veja: foi criada uma variavel para capturar o que o jogador falou depois da palavra. Se ele usou uma virgula, o que está depois dela será o segundo parametro, e o que está antes sera o primeiro, então o string.explode funciona como uma divisória, e pega o que está antes e depois. Entao, se existe algo antes e depois, o script vai, ao jogador correspondente ao que está antes da virgula, o item correspondente ao valor que está depois da virgula, na quantidade um. Entao se voce quiser que seja configurável a quantidade de itens, ficaria assim:

function onSay(cid, words, param)

local p = string.explode(param, ",")

if p[1] and p[2] and p[3] then

doPlayerAddItem(getPlayerByName(p[1]), p[2], p[3])

return 1

end

return 0

end 

Tudo que muda é que o script vê se existe um terçeiro parametro, e se existe, da ao jogador do parametro 1 a quantidade do parametro 3. Muito simples não? Se voce AINDA não entendeu, procure nas talkactions scripts que te ajudem a entender, com sua observação. III - Patterns Nota: se você não sabe o que é FOR, leia a Aula 10 da OTServ Networks. Nota²: Se você é um iniciante que ainda não conheçe string.gmatch, veja este trecho retirado de lua.org:

Retorna uma função iteradora que, cada vez que é chamada, retorna a próxima captura de pattern na cadeia s. Se pattern não especifica nenhuma captura, então o casamento inteiro é produzido a cada chamada.

Patterns (do inglês tradicional, "padrão") ou expressão regular, é um outro método. Primeiro vale saber que ele gasta mais espaço que STRING.EXPLODE (espaço, dizendo, me refiro a LINHAS). Então você se pergunta, qual a vantagem? Isso depende. Do meu ponto de vista, vale a pena saber, por que os PATTERNS estarão sempre em LUA, e o STRING.EXPLODE apenas em algumas LIBS. O Pattern vai desempenhar a mesma função que a string explode, e usamos ele com uma tabela. Olhe um exemplo (não é para open tibia):

local t = {}

local s = "String de Teste para o Tutorial. Exemplo de pattern. Esse é muito melhor que o otro. O MOCK é um urso gordo BRIMKS =D."

for k in string.gmatch(s, "%l+") do

table.insert(t, k)

end 

Nesse caso, criamos um tabela vazia (Por enquanto!) e uma string de testes. O for marcado como K fara uma "contagem" das capturas na string, e essas seráo de letras minusculas, definido com "%L+" Essa coisa de % ja me assustou muito, mas ela é tão fácil quanto bater um carro. Aqui está a lista:

.: (um ponto) representa todos os caracteres.

%a: representa todas as letras.

%c: representa todos os caracteres de controle.

%d: representa todos os dígitos.

%l: representa todas as letras minúsculas.

%p: representa todos os caracteres de pontuação.

%s: representa todos os caracteres de espaço.

%u: representa todas as letras maiúsculas.

%w: representa todos os caracteres alfanuméricos.

%x: representa todos os dígitos hexadecimais.

%z: representa o caractere com representação 0.

As saídas geradas por esse script seriam:

tring

de

este

para

o

utorial

xemplo

de

pattern

sse

muito

melhor

que

o

otro

um

urso

gordo

As letras maisculas foram ignoradas. Se voce mesmo quiser testar isso em um debugger, adiciona isso depois do END do for:

for i = 1, #t do print(t[i]) end 

Se voce ja está com isso feito no debugger, troque esse %l por outros elementos da lista e veja os resultados! Mas esse %x, será muito confuso para aqueles que não programam em linguagens como C++, C, etc. Quando começei a aprender C++ fiquei dias empacados nessa história de hexadecimal =/ Bom, agora que ja devem ter entendido um pouco, vamos ao exemplo em uma talkacion.

function onSay(cid, words, param)

p = {}

for getParam in string.gmatch(param, "(%P+)") do

table.insert(getParam,k)

end

if p[1] and p[2] and p[3] then

doPlayerAddItem(getPlayerByName(p[1]), p[2], p[3])

return 1

end

return 0

end 

Obs.: o nome da variavel do for, no meu caso getParam, pode variar. Apenas lembre de colocar ele no primeiro parâmetro do table.insert. Então se torna a mesma coisa, e por isso nao há necessidade de explicar, mas vou explicar breviamente: t é uma tabela vazia. Entao o for vai procurar todas aparições de um caractere de pontuação, e se eles existirem (vide o IF), ira operar com eles. Muito simples, não? Vale lembrar, que o + depois do padrão ira "agrupar" as ocorrencias. Eu nao irei ensinar coisas como o string.find, etc, pois esse tutorial não é de padrões, e sim de fazer talkactions com multiplos parametros, e o jeito que eu ensinei funciona perfeitamente. Agora, vamos fazer um teste para ver se voce realmente aprendeu?

1. Qual a vantagem de Pattern?

2. O que faz string.explode?

3. Quantos parametros posso criar?

4. Usando pattern em uma talkaction, eu me limito a operar com virgulas?

5. Qual a vantagem de usar multiplos parametros?

Respostas:

1. Expressões regulares fazem parte da biblioteca padrão, e o STRING.EXPLODE está apenas em algumas libs de Open Tibia.

2. Permite criar vários parametros de um jeito rápido e fácil.

3. Quantos sua imaginação permitir. Mas isso podera prejudicar algumas coisas, pois sempre lembre, tudo no computador tem seu peso e tempo de execução.

4. Não, os patterns oferecem diversos operadores, virgulas, espaços, números, etc.

5. Criar talkactions mais sofisticadas, com funções mais complexas e uteis.

E que tal exercitar a mente? Vou passar três exercícios, faça quem quiser aprender, e não faça quem se julga débil.

1. Crie uma talkacion para mandar uma mensagem para um jogador. Ex: /sendmsg Roku, oi

2. Se possuir um debugger externo (OTScript Live, SciTe...) faça o seguinte:

Crie uma tabela e uma string, e faça com que seja inserido nessa tabela todas ocorrencias de letras maisculas agrupadas.

3. Se possuir um debugger externo (OTScript Live, SciTe...), faça o seguinte:

Crie uma tabela com no mínimo 5 campos, com qualquer valor.

Entao usa um IF para verificar se esses valores existem, e se sim, "printar" eles.

Creditos

Roku

Contato;

6yonKDJ.png god.marinii

TaxNfhb.png

Link para o post
Compartilhar em outros sites
  • 3 years later...

Olá, tenho uma dúvida, consegui criar um novo parâmetro, esta funcionando como eu queria exceto uma coisa:

 

Ao criar um parâmetro, por exemplo: "," o problema é que para usar este parametro, em vez do player digitar somente  , (virgula) ele tem que digitar ", 

Já tentei com numero, virgula, letra, só funciona digitando 1 aspas e o parametro escolhido, tentei assim também:

 

 

 

","    para que funcione devo digitar a talkacion + ",       exemplo: correr ",oi

','     para que funcione devo digitar a talkacion + ',      exemplo: correr ',ola

""     Não funciona

"'"    para que funcione devo digitar a talkacion + "'      exemplo: correr "'ola

'"'     para que funcione devo digitar a talkacion + '"      exemplo: correr '"olá

''      Não funciona

 

 

Deixando assim:

 local t = string.explode(param, '"')

Devo digitar correr '"Qualquer mensagem

 

A talkaction é de uma spell correr, ao usar correr, o player ganha move speed, aparece um efeito

eu tentei colocar para que apareça também uma mensagem, o player deveria digitar

 

correr "mensagem

 

 

Ao fazer isso, deveria utilizar a spell correr e caso tivesse um parâmetro, aparecer a mensagem que digitou, assim:  Strong Haste "mensagem  ou  correr "mensagem

 

 

Consegui adaptar para isso, o unico problema é que o parâmetro utilizado para que isso aconteça não é o que está dentro das aspas e sim 1 aspas+o que está dentro

 

no caso se eu deixar assim:

 

local t = string.explode(param, '"')

 Se eu digitar:  correr "oi

Não funciona

 

Se eu digitar:  correr '"oi

Funciona

 

queria que ficasse como parâmetro somente o que tem dentro das aspas, tentei fazer com pattern e não consegui, será que não tem o string.explode na minha lib? 

 

Vou deixar o código aqui, poderia adapta-lo para Pattern? creio que não exista o string.explode na lib, meu server é PDA.

 

 

<talkaction hide="yes" words="correr" event="script" value="correr.lua"/>

Talkaction Script:

 

local condition = createConditionObject(CONDITION_HASTE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 10000)
setConditionFormula(condition, 1.7, -36, 1.7, -36)

function onSay(cid, words, param)
    local pos = getThingPos(cid)
    
    if(param == '') then
        doSendMagicEffect(pos, 14)
        doCreatureSay(cid, "Strong Haste: Correr", 20, false, 0, pos)
        doAddCondition(cid, condition)
        return true
    end
    
    
    local t = string.explode(param, '"')
    
    if(t[2]) then
        doCreatureSay(cid, "Strong Haste: ".. t[2], 20, false, 0, pos)
        doSendMagicEffect(pos, 14)
        doAddCondition(cid, condition)
    end    

return true
end

 

 

 

 

 

Link para o post
Compartilhar em outros sites
local t = string.explode(param, ",")

 

discord.pngDiscord: vankk #7765

Precisando de ajuda? Entre em contato comigo via Discord.

 

Muitos vêm seus muitos dias de glória, mas poucos vêm seus muitos dias de luta.

Link para o post
Compartilhar em outros sites
Agora, vankk disse:

local t = string.explode(param, ",")

 

Se eu fizer isso,o parâmetro não fica como uma virgula

ele considera os 2 primeiros caracteres

vai ficar como ",

 

exemplo deixando assim, se eu digitar:  correr ,mensagem

não funciona

dai eu digito:  correr ",mensagem 

ai funciona

nn sei pq em vez de considerar o que ta entre aspas como parametro, ele ta considerando os 2 primeiros caracteres, entendeu?

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo