Postado Novembro 16, 2012 12 anos 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; god.marinii [email protected]
Postado Dezembro 23, 2015 9 anos 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
Postado Dezembro 23, 2015 9 anos local t = string.explode(param, ",") Discord: 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.
Postado Dezembro 23, 2015 9 anos 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?
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.