Postado Novembro 16, 2012 13 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 10 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 10 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 10 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.