Ir para conteúdo

Ryzor

Membro
  • Registro em

  • Última visita

Tudo que Ryzor postou

  1. Compre um dedicado de 1 gb ou de 2 para iniciar seu projeto se der certo e lucros coloque na softlayer la e otimo . sugiro que vc começa numa LGV HOST ou Logica servers
  2. Ryzor postou uma resposta no tópico em Portal
    Eu tava procurando umas coisas e vi que muitos players esta revoltado porque a cipsoft faz UPDATES frequentemente eles tavao falando pa fazer em 1 em 1 ano seria melhor ;0
  3. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Aleatório Olá, estou a um tempo parado e decidi postar este tutorial conceitual. O objetivo hoje é explicar como funciona a função math.random(...) em lua. O que é aleatório? Por conceito aleatório é aquilo que é escolhido independente de qualquer valor, ao acaso. Aplicação? Na prática, não existe aplicação exata ao conceito, entretanto, utilizamos fórmulas matemáticas para gerar valores que fogem um pouco do controle do usuário. Quando se utiliza math.random por exemplo, você está pedindo para a máquina gerar um número, definirei portanto esta atitude como semi-aleatória. Por que semi-aleatório? Simples, quando você utiliza math.random, o computador gera um número através de uma base que foi fornecida, às vezes sem sua percepção, é a denominada semente. Semente? Planta? O conceito utilizado requer um pouco de imaginação para compreensão. Imagine que você planta uma semente de caju, daqui algum tempos a árvore crescerá, e você poderá colher os frutos. Com math.random também é assim, você define o valor de base, este valor vai dar origem a vários outros valores. O ser humano tem a capacidade de tomar múltiplas decisões? Não, ao menos não do ponto de vista matemático. As decisões são tomadas de acordo com as experiências que este acumulou e com o momento em que ele está, sendo importantes as variáveis do ambiente, pensemos na natureza como um computador gigantesco e de alta perfomance. OtServer Quando um OT inicia, a semente que eu citei anteriormente, é semada logo na inicialização, por isso os scripts não precisam utilizá-lo. Quando um .lua é criado separadamente, caso não se semeie os resultados serão sempre iguais. Resumo - Não entendeu? Leia o resumo... Sempre que você utiliza math.random, o computador gera um número de acordo com a base definida por math.randomseed.
  4. Ryzor postou uma resposta no tópico em Eventos de Mapping
    Talvez eu participe.to trabalhando no meu projeto estou dando um duro danado la. vo tenta faze algo bom até o dia da estrega
  5. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Faaaaala galerinha! A pedido de alguns usúarios estou aqui para postar este tutorial. Espero que seja útil para todos que tem alguma dúvida quanto ao Stackpos. Eu sinceramente não domino completamente a magia dos stackpos, mas espero poder tirar algumas dúvidas de quem sabe e ensinar quem ainda não sabe. Vamos logo ao tutorial: Stackpos • Introdução Stackpos é um dos index da tabela que guarda posições. Toda posição é uma tabela, exemplo: {x=160, y=50, z=7}, mas o que pouca gente sabe, é que o stackpos também faz parte desta tabela. Todos sabem que em uma unica posição podem haver vários itens, formando uma pilha de itens, portanto, para diferenciar a posição de um item da pilha para o outro foi criado o stackpos, que é o número que diz em qual lugar da pilha está o item. • Descobrindo o Stackpos O stackpos segue um padrão, ou seja, uma ordem. Vou mostrar primeiramente os stackpos especiais: 0 - O stackpos 0 de uma posição é sempre o tile, ou seja, o chão. 253 - Este número refere-se ao stackpos das criaturas que estão na posição, sejam monstros, players ou npcs. 255 - O item mais alto de um pilha tem o stackpos 255, além do stackpos normal dela. Agora vou mostrar como descobrir o stackpos de um item apenas olhando para a pilha. Considere a seguinte pilha: Tile sempre terá o stackpos 0. Agora os outros recebem o stackpos contrário da ordem deles acima do chão. Coin receberá o stackpos 1 e 255. Chair receberá o stackpos 2. Table receberá o stackpos 3. Simples não? É sempre ao contrário da ordem deles acima do chão. Vamos a mais um exemplo para ficar bem claro, considere a seguinte pilha: Para pegar o stackpos pelo uid do item, usamos a função getThingPos(uid), a qual já retorna uma tabela com o stackpos do item. É isso galera, qualquer dúvida só perguntar. Até mais. Creditos : Shoeei Primeiro vamos contar quantos itens tem a pilha. Neste caso, em um total de 4 itens (tile, table, chair, coin). Tile receberá o stackpos 0. Ring receberá o stackpos 1 e 255. Hammer receberá o stackpos 2. Coin receberá o stackpos 3. Chair receberá o stackpos 4. Table receberá o stackpos 5. • Montando uma Tabela com Stackpos Eu havia tido anteriormente que toda posição é uma tabela. Para montarmos uma posição com o index stackpos, simplesmente adicionamos ele no final, exemplo: {x=160, y=50, z=7, stackpos=253} Simples, não é mesmo? • Funções Auxiliares Sempre que preciso descobrir o stackpos através de um script, uso as seguintes funções: Pegar o stackpos pela posição e id do item. function getItemStackpos(position, id) if getTileItemById(position, id).itemid == 0 then return nil end for i = 0, 255 do local pos = getThingFromPos({x=position.x, y=position.y, z=position.z, stackpos=i}) if pos.itemid == id then return i end end end end
  6. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Metamétodos Bem, talvez não seja útil a todos (ou apenas não vejam a utilidade disso no começo), mas como já tinha feito um tutorial de POO em lua decidi me aprofundar mais e entrar em um assunto que não tem muita gente que sabe, ter um conhecimento intermediário sobre POO ajuda a aprender isso (saber usar a função setmetatable também), mas apenas um complementa o outro como veremos logo a seguir. Porque aprender ? Se eu dissesse que isso é necessário para programar eu estaria mentindo, mas pode acabar sendo útil, quem sabe para complementar o conhecimento de POO, mas é como eu já disse no outro tópico, aprende quem quiser. Metamétodos Metamétodos são (obviamente) associados a metatabelas, esses "métodos" são basicamente os eventos que ocorrem quando Lua (a linguagem) executa algumas operações: subtração, divisão, comparações, concatenações etc. É o que chamam em algumas linguagens de sobrecarregar operador (basicamente é a mesma coisa), cada evento tem um nome, adição é "add", exponenciação é "pow", concatenação é "concat", mais a frente eu cito todos e suas funções. Um exemplo, que caso você já saiba POO já deve ter visto é esse: Classe = {} function Classe:new() return setmetatable({}, { __index = self }) end Esse __index, já se perguntou o que ele faz ali ? Ele é um metamétodo também, ele simplesmente mostra que é para procurar indices(seja métodos, atributos, oque for) na tabela self (ou seja, nela mesma), e é por isso que quando você cria uma classe você consegue usar os métodos (não confunda com metamétodos), atributos dela. O 2º parametro da função setmetatable é uma tabela de metamétodos. Exemplo: metatable = {} function String(s) return setmetatable({ value = s or '' }, metatable) end function metatable.__add(a, b) return String(a.value .. b.value) end Veja que eu adicionei o metamétodo __add que se refere ao operador matemático de adição, com esse método você pode fazer isso (a seguir), tente executar e veja o resultado: s = String('Hello') print("Valor de 's' é: " .. s.value) m = s + String(' World') print("Soma de duas Strings: " .. m.value) Agora apague tudo e tente dessa maneira sem o metamétodo: metatable = {} function String(s) return setmetatable({ value = s or '' }, metatable) end s = String('Hello') print("Valor de 's' é: " .. s.value) m = s + String(' World') print("Soma de duas Strings: " .. m.value) Vai resultar em um erro. A partir disso você pode criar muitas coisas ! o exemplo acima (o que funciona) também pode ser escrito dessa maneira: function String(s) return setmetatable({ value = s or '' }, { __add = function(a,b) return String(a.value .. b.value) end }) end s = String('Hello') print("Valor de 's' é: " .. s.value) m = s + String(' World') print("Soma de duas Strings: " .. m.value) Eu pulei linha ali no setmetatable apenas pra ficar mais organizado e de fácil entendimento, não que seja necessário. Basicamente, metamétodos são os métodos que fazem operações em metatabelas lua, agora veja o mesmo exemplo acima mas sem o metamétodo: String = {} function String:new(s) return setmetatable({ value = s or '' }, { __index = self }) end function String:add(s) self.value = self.value .. s.value return self.value end s = String:new('Hello') print("Valor de 's' é: " .. s.value) m = s:add(String:new(' World')) print("Soma de duas Strings: " .. m) O uso ficaria um pouco mais complicado e não daria a liberdade de você fazer isso (em negrito): s = String('Hello') print("Valor de 's' é: " .. s.value) m = s + String(' World') + String(' and ') + String('Universe') print("Soma de quatro Strings: " .. m.value) Soma de quatro objetos String ao mesmo tempo (em negrito) --- A tabela com os metamétodos, toma-se class1 como um objeto de uma classe qualquer e class2 como um outro objeto da mesma classe de class1, ou numero, ou string, ou tabela, ou userdata, ou thread ou qualquer outro tipo de dado lua: As cores não estão ali a toa, Função/Nome = o nome e função do metamétodo; Uso = Como se deve usar; Parâmetros = Quais parâmetros o metamétodo possui; Exemplo = Exemplo de quando o metamétodo irá acontecer. Você pode encontrar todas os metamétodos junto a um exemplo nesse link http://www.lua.org/manual/5.1/pt/manual.html#2.8, mas vou citar alguns exemplos: TV = {} function TV:new(marca, polegadas) return setmetatable({ marca = marca or '', polegadas = polegadas or '' }, { __add = function (tv, n) -- Metamétodo de adição if (type(n) == 'number') then return TV:new(tv.marca, tv.polegadas + n) else return TV:new(tv.marca, tv.polegadas + n.polegadas) end end, __mul = function (tv, n) -- Metamétodo de multiplicação return TV:new(tv.marca, tv.polegadas * n) end, __eq = function (tv1, tv2) -- Metamétodo de igualdade if (tv1.marca == tv2.marca and tv1.polegadas == tv2.polegadas) then return true end return false end }) end tv1 = TV:new("LG", 21) tv2 = TV:new("Philips", 19) tv1 = tv1 + 4 -- Adiciono 3 a tv1 print(tv1.polegadas) -- tv1 fica com 25 polegadas tv2 = tv1 + tv2 -- Adiciono as polegadas da tv1 na tv2 print(tv2.polegadas) tv1 = tv1 * 2 -- Multiplico as polegadas da tv1 por 2 print(tv1.polegadas) if (tv1 == tv2) then print('tv1 é igual a tv2 !') else print('tv1 não é igual a tv2') end tv1 = tv2 -- Agora tv1 é igual a tv2 if (tv1 == tv2) then print('tv1 é igual a tv2 !') else print('tv1 não é igual a tv2') end O exemplo é ruim eu sei, mas to sem criatividade D: Explicação detalhada: Agora uma explicação passo a passo de um metamétodo, vou aproveitar o da TV: __add = function (tv, n) -- Metamétodo de adição if (type(n) == 'number') then return TV:new(tv.marca, tv.polegadas + n) else return TV:new(tv.marca, tv.polegadas + n.polegadas) end end e uma soma qualquer: tv1 = tv1 + 4 O metamétodo tem 2 parametros, tv e n (você pode escolher o nome que quiser), tv e n referem-se a tv1 e 4 na soma respectivamente, ou seja, o __add (linha 1) vai verificar se o n é um numero (linha 2) e caso for ele vai retornar outro objeto da classe TV , com a mesma marca da tv mas com as polegadas somadas ao numero n (linha 3) , mas caso não for um numero (linha 4) vai manter a marca da tv e somar as polegadas da tv e da TV n (linha 5) . Novamente, as cores (e o negrito) não estão ali a toa. Bem é um pouco complicadinho, mas todos (a maioria) dos metamétodos seguem esse mesmo padrão de 2 parametros, ai facilita um pouco --- Espero que alguém tenha compreendido, tentei ser o mais claro possível, caso contrario eu refaço as partes que estão complicadas, Qualquer dúvida, sugestão, critica, só postar ! Quem quiser pode me enviar sugestões de temas para tutoriais sobre scripting e programação, algum assunto que não entendeu, que não viu no forum ou que faltou algo mais detalhado. Creditos Lwkass
  7. Manipulando arquivos através de LUA Abrindo um arquivo Para começar, você terá que abrir o arquivo.Para isso, usamos a função io.open(arquivo[modo]), que também pode cria-lo caso não exista.Arquivo será o seu diretório,que caso não exista retornará nil, e modo são os seguintes: "r" - Modo de leitura. "rb" - Leitura em modo binário. "w" - Modo de escrita. "wb" - Escrita em modo binário. "a" - Adicionar ao arquivo. "r+" - Modo de atualização preservando os dados anteriores. "w+" - Modo de atualização apagando os dados anteriores. "a+" - Modo de adição e atualização, preservando os dados anteriores e adicionando ao final do arquivo. Por exemplo, quero abrir um arquivo que se chama Iuri.lua e está no disco rígido C:, uso: io.open("C://Iuri.lua") Caso o arquivo não exista, irá retornar nil. Escrevendo em arquivos Para fazer a escrita em um arquivo é muito simples, basta usar file:write(...), onde file é o arquivo que abrimos anteriormente.Em ... será colocada uma string que irá ser escrita conforme o modo de abertura do arquivo definido anteriormente. Ex.: local file = io.open("C://Iuri.lua") file:write('Este é um tutorial') file:close() Lendo arquivos Para fazermos a leitura do arquivo, usamos file:read(...).Se nenhum formato for especificado, ele usará o formato padrão("*l").Os outros formatos são: "*n" - Lê um número, este é o único formato que retorna um número ao invés de uma cadeia. "*a" - Irá ler o arquivo inteiro, iniciando da posição atual. number - Irá ler o arquivo até o número de caracteres definido. Ex.: local file = io.open("C://Iuri.lua") print(file:read()) file:close() Isso irá printar 'Este é um tutorial' no console , o que foi escrito anteriormente. file:lines() file:lines(), é usado em um laço for e sua sintaxe é a seguinte: for linha in file:lines do corpo end Isso criará uma repetição sobre todas as linhas do arquivo com linha retornando os caracteres da linha em questão. Ex.: local file = io.open("C://Iuri.lua") for linha in file:lines do print(linha) end file:close() Como só foi escrito uma linha no arquivo irá printar 'Este é um tutorial', se embaixo disso escrevessemos 'Teste' o for se repetiria 2 vezes e iria printar: 'Este é um tutorial' 'Teste' Finalizando o arquivo Por último, iremos finalizar o arquivo, usando o file:close(), que já foi mostrado nos exemplos anteriores. Deletando arquivos ou diretórios Para deletar arquivos e diretórios, usamos a função os.remove(file or directory), lembrando que o arquivo não pode estar em uso e o diretório vazio. Ex.: os.remove("C://Iuri.lua") Creditos Dean
  8. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    Umas imagems pa zuar o bi-rebaixamento =x
  9. Algumas LIBs úteis em OTServ Introdução: Não sou NENHUM expert em lua e estou LONGE de ser. Porém, ontem eu vim procurar algum tutorial que me evidenciasse facilmente o assunto em questão e não encontrei, então resolvi estudar um pouquinho e trazer para vocês Fonte: A fonte do meu estudo foi um site muito conhecido por scripters, que é: Lua-Users.org Explicações: Optei por incluir nesse tutorial explicações somente das libs que eu achei mais interessantes e que pude ver uma utilidade em OTServ, como Math, Os e Table. Se você acha que faltou algo de interessante ou que alguma explicação pode ser melhorada, por favor, poste construtivamente aqui, quem sabe até eu possa aprender mais Da Biblioteca Math...math.abs(v): retorna o valor absoluto de v -- o valor positivo math.floor(v): retorna o valor inteiro mais proximo e menor ou igual a v -- arredonda para baixo math.ceil(v): retorna o valor inteiro mais proximo e maior ou igual a v -- arredonda para cima math.min(a,b,c,d,...): retorna o menor valor do conjunto especificado entre parêntesis (a,b,c,d,....) math.max(a,b,c,d,...): retorna o maior valor do conjunto especificado entre parêntesis (a,b,c,d,....) math.random(a,b): retorna um valor aleatório entre a e b, incluindo ambos Da Biblioteca Os... os.date(): retorna uma string no formato MM/DD/YY HH:MM:SS. os.date('*t'): retorna uma tabela contendo {hour, min, wday, year, yday, month, sec, day, isdst(true)} os.date('!*t'): retorna uma tabela contendo {hour, min, wday, year, yday, month, sec, day, isdst(false)} os.time(): retorna o horário do sistema utilizando Unix Timestamp --(Conversor: http://www.unixtimestamp.com/index.php) os.difftime(t2, t1): retorna os segundos de diferença entre os tempos t2 e t1 Da Biblioteca Table... table.insert(table, [pos,] v): insere um elemento de valor v na tabela table na posição pos. --NOTA: Se não for especificada a pos, o elemento será inserido no fim da tabela. table.remove(table [, pos]): remove o elemento da tabela table que está indicado pelo índice pos. NOTA: Se não for especificada a pos, removerá o último elemento da tabela. table.concat(table [, sep [, i [, j]]]): Concatena (une) os elementos da tabela table a fim de formar uma string. --NOTA: sep é o elemento separador e i e j são os índices de começo e fim, respectivamente, dos elementos que serão concatenados. table.sort(table [, comp]): reordena os elementos da tabela table segundo as especificações de comp. --NOTA: O padrão é: function(a,b) return a<b end, ou seja, reordernação ascendente. Da Biblioteca String... string.lower(s) ou s:lower(): Retorna a string s após fazer com que todos seus caracteres maiúsculos se tornem minúsculos. --Tudo minúsculo, oposto de string:upper string.upper(s) ou s:upper(): Retorna a string s após fazer com que todos seus caracteres minúsculos se tornem maiúsculos. --Tudo maiúsculo, oposto de string:lower string.gsub(s, pattern, replace [, n]) ou s:gsub(pattern, replace [,n]): Retorna o texto s após substituir os caracteres pattern do texto pelos caracteres definidos em replace, sendo n o limite de subtituições, que caso não seja definido, é ilimitado. string.len(s) ou s:len(): Retorna a quantidade de caracteres da string s. string.reverse(s) ou s:reverse(): Retorna a string s reordenada de forma contrária. string.rep(s, n) s:rep(n): Gera uma string que são n cópias da string s concatenadas. Outras bibliotecas... tonumber(a): Converte a string a para números. OBS: OBRIGATÓRIO DEFINIR // NÃO-OBRIGATÓRIO DEFINIR Considerações Finais: Esse tutorial foi feito para dar uma noção do quão úteis podem ser essas libs. Quem já tem essa noção e já sabe trabalhar acha um tutorial desse desnecessário, mas assim como eu, muitos não sabem que podem ter grande utilidade. Dica: Sempre que estiverem a fim, deem uma olhada no Lua-Users.org, site citado no início do tutorial, na parte Fonte. Há muitas coisas legais lá, e se cresce bastante estudando assim, apesar de o site estar em inglês. Até a próxima! Creditos : Guiminhah
  10. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    E vai continuar crecendo cada vez mais Rumo Ao 500!
  11. Tipo quero 1 empresa que so venda Dedicados , porque muitos me disserão as que vende so DEDICADOS e a melhor , e poça usar saldopagseguro para pagar também ! alguem poderia me mandar alguma empresa boa ai ?
  12. 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
  13. Isso vc tem que edita em cada char seu da database, os Sample , Drudi Sample, Paladin Sample e etc , para coloca a posição do templo para o player nascer vc tem que ir em accoutmanager.php e digitar posx , apos digitar vai ter 3 coisas la ai vc poe a posição de seu templo ex 160 51 7 lembrando sobre o level vc tem q ve se ta tudo correto o tanto de life,mana e etc comigo fiz isso na database e deu certo.
  14. Tenho em meu PC algumas listas copm informações para se colocar em algumas funções que não se acha tão facilmente... - = Slots = - Aposto que muitos já se perguntaram o que por em slot na função getPlayerSlotItem(cid, slot). Abaixo há a resposta: CONST_SLOT_HEAD (1) = helmet CONST_SLOT_NECKLACE (2) = necklace slot CONST_SLOT_BACKPACK (3) = backpack CONST_SLOT_ARMOR (4) = armor CONST_SLOT_LEFT (5) = left hand CONST_SLOT_RIGHT (6) = right hand CONST_SLOT_LEGS (7) = legs CONST_SLOT_FEET (8) = boots CONST_SLOT_RING (9) = ring slot CONST_SLOT_AMMO (10) = ammo slot Exemplo de uso: if getPlayerSlotItem(cid, 10).itemid == 2229 then doPlayerSendTextMessage(cid, 22, "Você tem uma caveirano lugar das munições.") end Que seria o mesmo que: if getPlayerSlotItem(cid, CONST_SLOT_AMMO).itemid == 2229 then doPlayerSendTextMessage(cid, 22, "Você tem uma caveirano lugar das munições.") end Nota: a função getPlayerSlotItem(cid, slot) retorna uma table de três valores: itemid, uid e actionid. description weight defense attack attackspeed weaponType extradef absorbPercentDeath absorbPercentHoly absorbPercentIce absorbPercentEnergy absorbPercentEarth absorbPercentFire absorbPercentPhysical skillShield magiclevelpoints defense weaponType armor slotType weight speed Um exemplo muito usado em scripts de refinamento: doItemSetAttribute(item2.uid,"extradefense",8) Nota: as keys devem sempre ser usadas como uma string, ou seja, entre aspas. Nota2: Aquelas keys listadas não são as únicas, mas são as menos conhecidas. há também aid que representa a action id entre outras(que também precisam ser usadas como string). SKILL_FIST (0) = Fist Fighting SKILL_CLUB (1) = Club Fighting SKILL_SWORD (2) = Sword Fighting SKILL_AXE (3) = Axe Fighting SKILL_DISTANCE (4) = Distance Fighting SKILL_SHIELD (5) = Shielding SKILL_FISHING (6) = Fishing Exemplo: doPlayerAddSkill(cid, 1, 8) Que seria o mesmo que: doPlayerAddSkill(cid, SKILL_CLUB, 8) Espero que tenha ajudado Creditos Antharaz - = Keys = - Outra coisa importante são as keys de itens, usadas nas funções doItemSetAttribute(uid, key, value), doItemEraseAttribute(uid, key) e getItemAttribute(uid, key). Abaixo há uma lista com as keys: - = Skills = - Por último mas não menos importante há os skills, onde são usados em funções como doPlayerAddSkillTry(cid, skillid, n[, useMultiplier]), doPlayerAddSkill(cid, skillid, amount) entre outras. Abaixo segue a lista:
  15. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Este tutorial abaixo foi inteiramente criado por shoeei. Introdução Vou tentar ajudar vocês com um tutorial de os.date. Sendo sincero, eu aprendi a pouco tempo como usar o os.date, em um exemplar de programação lua. Estou fazendo este tutorial para esclarecer a maioria das duvidas que vocês possam ter, então, por favor, prestem muita atenção se forem ler, e não leiam a menos, que estejam com tempo, paciência e vontade de aprender, pois eu creio que mesmo sendo novato com o os.date, eu vou conseguir fazer um bom tutorial. Publico Alvo Este tutorial foi feito para ensinar programadores lua, do nível iniciante/intermediário, ou seja, aqueles que já tem algum conhecimento quanto a os.time, variáveis, loopings, e etc... Tutorial Em OtServers, os.date é pouco explorado, já que sua funcionalidade, é, por muitos, desconhecida. Então vou explicar como você poderia usa-lo em um script para o seu ot. Vamos ver, digamos que você queira que um script funcione a partir das oito da manhã, e pare de funcionar a partir das duas da tarde; para isso, você poderia usar o os.date. O os.date, assim como o os.time, serve para controlar valores de tempo, e retornam os mesmos de acordo com os valores da cpu, a partir de quando o script entra em funcionamento, então, o exemplo acima ficaria assim: function onSay(cid, words, param) if os.date("%X") >= "08:00:00" and os.date("%X") <= "14:00:00" then doPlayerSendTextMessage(cid, 22, "Teste") end end No exemplo acima, a talkaction só ira funcionar se for depois das oito da manhã, e antes das duas da tarde, então, dentro deste intervalo de tempo, o script funcionará normalmente, e irá mandar a mensagem "Teste" para o jogador. Já se o script for executado fora deste intervalo, no caso, nada acontecerá. Deve-se notar, também, que no script acima, dentro dos parênteses esta isto: "%X" Certo, eu acho que eu poderia chamar isto de Pattern; existem vários destes parâmetros que podem ser utilizados, neste caso, eu usei o "%X", pois ele retorna valores do horário na seguinte forma: Onde, azul são as horas, vermelho são os minutos, e verde são os segundos; neste caso, você deveria usar os números como um relógio digital de 24 horas. Acho que a lógica do os.date já deu para entender, mas vamos recapitular: O os.date é usado para retornar algum valor de tempo; Você pode usa-lo como uma condição para executar um outro comando; Dentro dos parênteses do os.date, você deve usar parâmetros. Uma coisa muito importante do os.date, é que você deve igualar ele, com valores entre aspas, mesmo que sejam números, por exemplo: if os.date("%X") >= "08:00:00" and os.date("%X") <= "20:00:00"Perceba que os números estão entre aspas. Certo, depois de termos recapitulado a lógica do os.date, vamos aos mais importantes parâmetros que podem ser usados e os valores que são retornados por eles; segue a lista: Pattern - Explicação: %a - dia da semana abreviado (Wed) %A - dia da semana completo (Sunday) %b - nome do mês abreviado (Sep) %B - nome do mês completo (April) %c - data e hora (09/16/98 23:48:10) %d - dia do mês [01-31] %H - hora de um relógio de 24 horas [00-23] %I - hora de um relógio de 12 horas [01-12] %M - minutos [00-59] %m - mês [01-12] %S - segundos [00-60] %w - dia da semana por números [0-6 = Domigo-Sabado] %x - data (09/16/98) %X - hora (23:48:10) %Y - ano (1998) Vocês podem perceber que todas as palavras que forem usadas, tanto abreviações, como palavras inteiras, devem ser em ingles, é claro. Certo, dito os mais usados parâmetros e a lógica do os.date, acho que isso pode encerrar o nosso tutorial, mas antes, uma ultima dica; se você tem duvida de que valor o parâmetro vai retornar, faça o seguinte: function onSay(cid, words, param) local par = os.date("Parâmetro") doPlayerSendTextMessage(cid, 22, "O valor é "..par.."!") end E por ultimo, mas não menos importante, para se criar uma tabela usando o os.date, deve-se usá-lo da seguinte maneira: os.date("*t", Valor_da_Tabela) Finalização Isso deve funcionar e encerrar o nosso tutorial; é claro que o os.date pode ter mais alguma utilidade que eu desconheça, mas eu acho que isso pode ser uma boa introdução dele. Espero que tenham gostado, ate mais.
  16. Ryzor postou uma resposta no tópico em Suporte Tibia OTServer
    Simples somente você ir em accountmanagement.php do seu xamp , digitar (POSX) e coloca a posição do seu templo
  17. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    os fdps estão atacando as regioes de são paulo porque a merda da ROTA mato 6 integrantes deles e entre esses 6 dia um dos lider deles no meio por isso tão fazendos os ataques
  18. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    Guuh tava nele ate agora parça =x,beatriz eu ia fala uma coisa + vo preferi fikar queto ;x to em panico aki kkkkkkkkkkkkkk
  19. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    eu não sei fritar nem 1 ovo , nem fazer 1 miojo eu sei kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
  20. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    Velho to me cagando kkkk , pcc ( Primeiro Comando Da Capital ) esta na minha cidade metendo fogo em carros e onibus,e policia subindo e dessendo minha rua aguia passando escolas fechadas,comercios fechados, oq devo fazer kk
  21. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    kkkkkkkkkkkkkk
  22. Mlk e foda memo em ? hackiando PayPal o..o
  23. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Descupe esqueci completamente . creditos postados.
  24. Ryzor postou uma resposta no tópico em Tutoriais sobre Scripting
    Esse é uma possibilidade de todo otserver mas foi se esquecendo a medida do tempo em que poggers pessoas foram excluindo isso e colocando aquelas tags de ataques nos monstros. Exemplo: Codigo: <attack name="fire" interval="2000" chance="7" range="7" min="-25" max="-45"> <attribute key="shootEffect" value="fire"/> </attack> Sendo que antigamente você fazia as spells dos monstros por scripts. Como apenas 2% de vocês deve saber isso ainda existe e funciona e por sinal bem melhor e mais fexivel que essa besteram que fizeram com os monstros. Vou lhes ensinar como. Primeiro pense em uma spell para seu monstro. Vamos imaginar uma spell de notas brancas que deixa o player dazzled e faz o monstro falar Seu nb _)_ Antes de tudo vamos adcionar a tag dela no spells.xml Código: <instant name="spell do mock" words="notas_brancas" enabled="0" event="script" value="notas brancas.lua"></instant> Beleza. Como sempre igual a uma spell POREM deve-se por enabled="0" e nao por mais nada alem do script e words. Agora crie o notas brancas.lua e basta criar o script da spell. Eu vou postar esse aqui APENAS DE EXEMPLO Código: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 24) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2.0, -150, -1.9, -150) local condition = createConditionObject(CONDITION_DAZZLED) setConditionParam(condition, CONDITION_PARAM_DELAYED, 1) addDamageCondition(condition, 5, 3000, -200) addDamageCondition(condition, 1, 5000, -200) setCombatCondition(combat, condition)arr = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, } local area = createCombatArea(arr) setCombatArea(combat, area) function onCastSpell(cid, var) doCreatureSay(cid,'Seu nb _)_',1) return doCombat(cid, combat, var) end Se quiserp ode usar a que eu postei acima para testar. Em seguida vá até um monstro que voce quer que ele usa a spell e coloque isso: Código: <attack name="notas_brancas" interval="2000" min="-250" max="-350"/> Pronto, de reload PRIMEIRO em spells depois em monsters e sumone seu monstro. E você vai ver que ele vai soltar essa spell!! Ai você pode modificar a spell e criar aquelas spells mais locas (nao funciona spell criada naquelas besteras de spell maker) E o dano você configura na tag e nao no script que ainda fica bem melhor. E se quiser pode modificar o script para nao ser uma spell e sim uma açao exemplo teleportar o monstro para o lado do player. Assim: Código: function onCastSpell(cid, var) if isPlayer(getCreatureTarget(cid)) then local p = getCreaturePosition(getCreatureTarget(cid)) p.x = p.x+math.random(-1,1) p.y = p.y+math.random(-1,1) doTeleportThing(cid,p) doCreatureSay(cid,'NAO CORRE NAO QUE EU GOSTO!',3) end return true end Dentre outras coisas Creditos : Mock
  25. Ryzor postou uma resposta no tópico em Playground (Off-topic)
    Skyforever tira esse bang gritando ai kkkkkkkkkkkkkkkkkkkkkkkk , tomei puta susto cara tava escutando um funk do nada aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Informação Importante

Confirmação de Termo