Ir para conteúdo

tibiaa4e

Conde
  • Total de itens

    912
  • Registro em

  • Última visita

  • Dias Ganhos

    1

Tudo que tibiaa4e postou

  1. Que beleza! Assim quem sabe o povo libera os codigo ai e melhora não só a qualidade do xtibia como do otserver brasileiro Bela iniciativa
  2. @up Vou ver é que no dia não consegui pq de uns erros de getthing Eu vejo qdo chegar em casa
  3. @up Estou tentando tbm Eu coloquei isPlayer mais não testei ainda
  4. @up legal msm Esse math.floor eu vi acho que no c e não sabia pra que servia Curti bastante esse
  5. @up Bem para quem aprendeu loops e vetor a pouco tempo EU achei muito bom E não ligue para script grande ou pequeno Funcionar é o que importa
  6. Pasta Enciclopedia com todos os links de outros tutoriais ! http://www.xtibia.com/forum/Pasta-Data-Enc...r-E-t99746.html Tutorial de Lua (Intermediario) Bem aqui meu primeiro tuto como colaborador. Esse tutorial tenta melhorar seus conhecimentos sobre lua, facilitar os proximos scripts e até melhor entender alguns scripts mais avançados. Aqui terá algumas noções de for,while,repeat,vetores e o addevent que não vem do Lua mais achei apropriado explica-lo aqui. O problema é que para saber addevent tem que saber criar funções, e para isso é bom saber sobre escopos. O que sempre é ensinado após ou antes dos loopings. Então vamos fazer isso tudo junto. Escopo e variaveis locais Para melhor explicar os loopings, é bom você entender o que seria escopo e as variaveis locais. Praticamente escopo só serve para variaveis locais mesmo (pelo menos não lembro outro motivo pra ele). Veja esse exemplo if item.uid == 2300 then --inicio escopo 1 local escopo1 = 2500 queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then --inicio escopo 2 local escopo2 = 3000 if playerCap >= itemWeight then --inicio escopo3 local escopo3 = 2000 doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end --fim escopo 3 else doPlayerSendTextMessage(cid,24,"The chest is empty.") end --fim escopo 2 end --fim escopo 1 No caso, usei essas variaveis locais, para tenta explicar o que é escopo. Cada variavel local indica o escopo existente. Escopo é um espaço do script, normalmente entre condicionais ou loopings. Os comentarios indicam inicio e fim de cada escopo. No caso de otserver, escopo não chega a ser muito util, porém ajuda nas outras linguagens e ensina como usar as variaveis locais. A importancia da variavel local, é fazer ela valer apenas no escopo, para não haver confusões de 2 scripts correntes usarem a mesma variavel e ferrar seu servidor. Laços de Repetição (looping) Os loopings, são condicionais usadas para facilitar certas ações, e não deixar os script com um tamanho gigantesco, os mais usados são o for,while e repeat. Em tese eles fazem a mesma coisa, que é repetir tudo que está dentro do escopo, porém cada uma tem seu jeito de fazer. For O for talvez seja o looping mais usado. O que ele faz é repetir todo seu escopo o numero de vezes mandando. Vou dar a sintaxe dele. for variavel = numero inicial, numero final do comandos end Em português estruturado : para variavel = numero inicial, numero final faça comandos fim Um exemplo pratico : for i= 1,24 do doPlayerAddItem(cid,2150,1) end Esse script acima vai adicionar 24x o item 2150 ao player. Então no caso você economizo no minimo 21 linhas. Claro que essa estrutura não serve so para isso. Lembrando que esse i não é obrigatorio, ele é a chamada variavel de controle. Até hoje não sei porque todo mundo usa i como variavel de controle do for. Você também pode fazer um for mais util do que esse, ao final do script mostrarei outros exemplo. while O meu looping favorito de se usar, também é muito utilizado. Ele repete o seu escopo, enquanto a condicional for verdadeira. Exemplo : while (variavel == 60) do comandos end Ou : enquanto (worldtime > 60) faça comandos fim Ai no caso enquanto a variavel for igual a 60 ele irá executar todos os comandos dentro dele. O while se assemelha um pouco ao if, pois deve se usar sinais matematicos tem o and e o or. Eu achei um exemplo na função : function getTibiaTime() local worldTime = getWorldTime() local hours = 0 while (worldTime > 60) do hours = hours + 1 worldTime = worldTime - 60 end return {hours = hours, minutes = worldTime} end Então enquanto o worldtime for menor que 60, ele irá pegar a hours e somar + 1, depois pegará o worldtime e diminuirá em 60 Ou seja ele irá contar as horas em 3 linhas. O que será uma tarefa impossivel sem um looping. E veja que faze-la no for também seria dificil, já que teriamos que saber que horas seria. O que seria anormal, pois para que saber a hora, se ja sabemos ??? repeat Esse ultimo looping e não menos importante, ele faz as repetições até que aconteça algo. repeat comandos until ( variavel == 1) Ou : repita comandos atéque (variavel == 1) Aqui nos meu ot ainda não achei nenhum com repeat, porém pode ser que ache algum util para ele. Dá para usar o exemplo do while aqui repeat hours = hours + 1 worldtime = worldtime - 60 until (worltime >60) Lembrando que o repeat não tem end, se vc colocar vai dar erro xD. Aqui você viu os três loopings mais importantes, e sem duvidas isso ajudará a compreender alguns scripts e até diminuir outros. Agora quando usar cada cabe a você decidir, já que cada um tem vantagens e desvantagens. Um exemplo é esse desafio. Adicionar Magic Plate armors no player até a capacidade acabar ou no maximo 30 delas. com for : for i=1,30 do if getPlayerFreeCap(cid) >= 85.00 then doPlayerAddItem(cid,2472,1) end end com while : while (cap >= 85.00) and (mag <=30) do cap = getPlayerFreeCap(cid) mag =mag+1 doPlayerAddItem(cid,2472,1) end com repeat : repeat cap = getPlayerFreeCap(cid) doPlayerAddItem(cid,2472,1) mag =mag+1 until (cap >= 85.00) and (mag <=30) Veja que no for eu nem tentei (até pq n lembrava maneira) de colocar até a capacidade acabar. Porém para adicionar um numero exato de itens ou sequencia ele é melhor que os outros. Porém o while e o repeat se dão melhor ao adicionar até a capacidade acabar. Agora que você ja entende, ou pelo menos ficou menos confuso, vou tentar explicar vetores. Vetores e Matrizes Alguns devem se perguntar que escremento é esse ? Entretanto, devem conhecer pelo nome array. Agora o vetor é uma variavel que armazena varias variaveis. Por exemplo imagine uma tabela do excel, as linhas seriam os vetores. Ou seja cada linha pode guardar varios dados. Já a matriz seria colunas e linhas, porém no otserver dificilmente ou nunca vc irá usar matriz, até porque LUA não prescisa declarar variavel e acho que matriz nem existe no LUA. Voltando aos vetores, existem algumas vantagens, ao usa-los. Muitos dizem que ocupa menos memoria ram, é verdade, porém ao menos que você tenha 2 mb de ram, não irá fazer diferença nenhuma. Eu acho a principal vantagem é poder deixar mais organizado e até facilitar a compreensão de scripts. Por exemplo vou mostrar um script de quando eu era iniciante. --function by ta4e-- --for tibia 7.92-- function onUse(cid, item, frompos, item2, topos) presente = math.random(1,11) pos = getPlayerPosition(cid) --surprise bag blue-- if presente == 1 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2687,10) --cookie doRemoveItem(item.uid,1) elseif presente == 2 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6394,1) --cream cake doRemoveItem(item.uid,1) elseif presente == 3 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6280,1) --party cake doRemoveItem(item.uid,1) elseif presente == 4 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6574,1) --bar of chocolate doRemoveItem(item.uid,1) elseif presente == 5 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6578,1) -- party hat doRemoveItem(item.uid,1) elseif presente == 6 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6575,1) -- red baloon doRemoveItem(item.uid,1) elseif presente == 7 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6577,1) -- green baloon doRemoveItem(item.uid,1) elseif presente == 8 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6569,3) -- candy doRemoveItem(item.uid,1) elseif presente == 9 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6576,1) -- firework rocket doRemoveItem(item.uid,1) elseif presente == 10 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6572,1) -- party trumpet doRemoveItem(item.uid,1) elseif presente == 11 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2114,1) -- piggy bank doRemoveItem(item.uid,1) end return 1 end Enormee e grotesco. Agora veja o que a SVN fez (roubou meu script ) diminuiu xD local bluePresent = {2687, 6394, 6280, 6574, 6578, 6575, 6577, 6569, 6576, 6572, 2114} local redPresent = {2152, 2152, 2152, 2153, 5944, 2112, 6568, 6566, 2492, 2520, 2195, 2114, 2114, 2114, 6394, 6394, 6576, 6576, 6578, 6578, 6574, 6574} function onUse(cid, item, fromPosition, itemEx, toPosition) local count = 1 if item.itemid == 6570 then local randomChance = math.random(1, 11) if randomChance == 1 then count = 10 elseif randomChance == 2 then count = 3 end doPlayerAddItem(cid, bluePresent[randomChance], count) elseif item.itemid == 6571 then local randomChance = math.random(1, 22) if randomChance > 0 and randomChance < 4 then count = 10 end doPlayerAddItem(cid, redPresent[randomChance], count) end doSendMagicEffect(fromPosition, CONST_ME_GIFT_WRAPS) doRemoveItem(item.uid, 1) return TRUE end Esse ainda funciona com a red. Tirando a parte da red surprise bag, os dois funcionam da mesma forma, porém para quem entende scripts o segundo é bem mais facil. Bem a sintaxe da matriz é muito facil. nome da matriz = {primeiro item,segundo item} Para usar deve se usar como se fosse a variavel mais o numero da "coluna". Por exemplo local itens = {"boots of haste","giant sword"} if math.random (1,3) == 1 then doPlayerAddItem(cid,itens[1],1) else doPlayerAddItem(cid,itens[2],1) end Veja se a sorte do player for 1 ele adiciona o item boots of haste, se for 2 ou 3 ele adiciona a giant sword. Claro que esse scripts não iria funcionar. Porém é so um exemplo para melhor explicar o bendito vetor. Porém acho que é mais comum você observar o vetor sendo usado para indicar varios itens ao inves de apenas um. local useWorms = FALSE local waterIds = {493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} function onUse(cid, item, fromPosition, itemEx, toPosition) if isInArray(waterIds, itemEx.itemid) == TRUE then if itemEx.itemid ~= 493 then if useWorms == FALSE or useWorms == TRUE and doPlayerRemoveItem(cid, ITEM_WORM, 1) == TRUE then if math.random(1, (100 + (getPlayerSkill(cid, SKILL_FISHING) / 10))) <= getPlayerSkill(cid, SKILL_FISHING) then doPlayerAddItem(cid, ITEM_FISH, 1) end doPlayerAddSkillTry(cid, SKILL_FISHING, 1) end end doSendMagicEffect(toPosition, CONST_ME_LOSEENERGY) return TRUE end return FALSE end Nesse caso o autor do script ele diminui varias linhas usando o vetor. if isInArray(waterIds, itemEx.itemid) == TRUE then No Português Estruturado : Se estiver no vetor (nome do vetor, uid ) == verdadeiro faça Ou seja tudo que tiver no vetor waterIds e for itemEx (item2) vai ser considerado. O vetor tem essas duas utilidades nos otserver, se você observar bem o seu uso vem sendo aumentado a algum tempo. E não domina-lo é um erro para grandes scripts. Um bom exemplo é meu script da arena que na versão 3.0 os três scripts de movements tinham 1200 linhas, na 4.0 com uso de umas funções e if melhorados diminui para 400. E na futura versão 4.0 Virarão torno de 80 linhas, com uso dos arrays e for. Funções Criar funções é uma coisa maravilhosa, se você costuma sempre incrementar algo no seu otserver é muito util saber criar algumas delas. Por exemplo todos esses doPlayerAddItem e doSetPlayerStorageValue são funções. Quem leu o segundo tutorial entendeu as funções de otserver. E pelo que me lembre expliquei que podemos dividir as funções em dois grupos. As retornam valores e as que não. Porém na verdade 99% das funções retornam valores, porém torno de 60% são erros. Por exemplo se vc manda o otserver adicionar um item que não existe ele retorna uma mensagem de erro. Porém essa mensagem é inutil para o script, só mostra que você esqueceu ou é burro (xD). Um exemplo de função que retorna o seu dinheiro no player. function getPlayerMoney(cid) return ((getPlayerItemCount(cid, ITEM_CRYSTAL_COIN) * 10000) + (getPlayerItemCount(cid, ITEM_PLATINUM_COIN) * 100) + getPlayerItemCount(cid, ITEM_GOLD_COIN)) end (Observe as frescuras da SVN de tentar deixar o script bom para iniciantes, e depois eles usam variaveis que só tem nas sources.) Se você gosta de frescura pode "socar" variaveis no global.lua com nomes para ser ids. Eu ja odeio isso xD. Voltando ao script, ao usar essa função, ele irá retornar a quantidade de din din que vc tem Sendo usada assim. dinheiro = getPlayerMoney(cid) doCreatureSay(cid,dinheiro,TALKTYPE_ORANGE2) Ou do jeito que você quiser, veja que essa função retorna algo. Espero que entendam essa parte. Agora a vantagem de fazer uma função ? Pode tirar a repetição de alguma coisa. Por exemplo : if item.uid == 2300 then queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end Cada bloco desse é uma quest do meu otserver, e pelo que contei aqui tenho 90. Imagine que lindo para eu me achar ? Criei so por diversão uma função. function doQuest(cid, item, count, storage, value, take) local itemWeight = getItemWeightById(item, 1) local playerCap = getPlayerFreeCap(cid) if getPlayerStorageValue(cid, storage) == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. '.') container = doPlayerAddItem(cid, item, count) setPlayerStorageValue(cid, storage, value) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. ' weighing ' .. itemWeight .. ' oz it\'s too heavy.') end else doPlayerSendTextMessage(cid,24,'The ' ..take.. ' is empty.') end end E agora cada linha de quest minha fica. if item.uid == 2300 then doQuest(cid,2493,1,2300,1,'chest') end Melhor ? O unico problema é que no TFS 0.3.0+ ela da um erro (O bau abre como chest, porém a quest é feita normalmente.) Essa é uma função media, porém se você leu todos meus tutoriais ja entende ela facinho. Mais vou explicar como fazer passo a passo ela. function doQuest(cid, item, count, storage, value, take) Aqui você indica como ela será usada no script. Os nomes não importam, o que importa é vc usar eles em todo o script o mesmo. A ideia aqui é pegar tudo que vc prescisa. Item : É o id do item que o bau irá dar. count : A quantidade desse item. storage : É o storage value adicionado. value : O valor do storage adicionado. take : O nome do lugar que vc pega. Claro que eu fiz uma que atendesse todas minhas necessidades. O value e o take podem ser facilmente excluidos. Depois que declarei todos os requesitos devemos passa a parte de como fazer. Veja que usei todas as variaveis, usadas na função aqui dentro. Uma das regras da programação é : A maquina é burra, você tem que dar passo a passo o que ela deve fazer. Ou seja não esqueça de nenhum passo nas funções. Um erro gravissimo é o cara esquecer de meter no cid no começo. Se vc esquecer quando for rodar no otserver, vai dar milhões de erros, e tudo porque você esqueceu o cid. Lembrando novamente que não importam os nomes, eu poderia fazer isso. function doQuest(macaco, lixo, quantidade, seila, tipo, ultima) Se eu colocasse esses nomes no motor dele, iria funcionar normalmente. E também você pode usar funções suas dentro de funções suas, que irão funcionar normalmente. O lugar mais adequado de coloca-las é no global.lua. Se vc usa the forgotten server coloque-as no funcitons.lua. Porém se você for mais alienado pode criar um arquivo para suas variaveis. É só adicionar no global.lua essa linha dofile('data/meuarquivo.lua') Isso se ele tiver na pasta data (de preferencia dentro dela.) Mais uma inutilidade que você aprende aqui. Depois dessa volta enorme que demos aqui. É hora de explicar o bendito addEvent. addEvent e stopEvent Bem essa parte tem até certos creditos ao tutorial do noobinhu, pois eu não sabia que tinha stopEvent. Porém eu vou explicar da minha maneira. Também ao meu grande amigo Soulblaster que foi que me ensino a base sobre isso. O dificil do addEvent é explicar como o cara deve fazer a função. Já que vcs devem saber, o resto é facil. A função do addEvent é fazer rodar uma função num certo tempo. Ao contrario do que muitos pensam (até eu), colocar uma função depois do addEvent não fará ela rodar após ele. exemplo : addEvent(lever1, 5000) doSendMagicEffect(xadrexpos,12) Esse doSend... rodará antes dos 5 segundos. Ou seja, tudo que tenha que rodar em 5 segundos deverá estar na função. Isso vale também para varios addEvents. addEvent(tp1, 1000,cid) addEvent(tp2, 1000,cid) addEvent(tp3, 1000,cid) addEvent(tp4, 1000,cid) No caso acima todos irão rodar juntos, já que ele não espera um acabar para rodar o proximo. addEvent(tp1, 1000,cid) addEvent(tp2, 2000,cid) addEvent(tp3, 3000,cid) addEvent(tp4, 4000,cid) Esse seria o efeito certo. Agora que dei os macetes, explicarei a sintaxe. addEvent(função,tempo em milessegundos,parametros) Milessegundos é 1000 = 1 segundo e assim vai, os parametros são os das funções. Se houver apenas 1 parametro coloque-o direto. Se houver varios deve ser colocar entre chaves. addEvent(tp1, 1000,{cid=cid, topos= topos} Ou fazer o que muitos fazem : p = {cid=cid,topos=topos} addEvent (tp1, 1000,p} Esse p também é opcional, e não sei pq o usam sempre... Isso é mais simples, e você deve usar todos os parametros da função. Lembra que falei que o nome não importa na função ? Aqui meio que importa já que você deve declarar tudo. É mais ou menos como se fosse usa-la em um script. Exemplo : p = {cid = cid, item = 2493, count = 1, storage = 2300, value = 1, take = "chest"} addEvent (doQuest, 3000 , p) Facil ? Eu acho que sim. O stopEvent é simples também stopEvent (função ) Nunca usei, será util se você colocar o addEvent em um looping ou sei lá. E digo mais que no tempo que comecei tivesse um tuto porco desse, eu acho que seria m scripter bem melhor. Bem espero que esse tutorial seja util ao todos que leram, qualquer duvida ou dificuldade reportem, se gostarem não deixem de comentar. Não sei se ficou muito bom (até pq são 02:43 mins da madrugada, e como não bebo e não tem coca-cola, tomei uns 30 copo de leite). E aguardem os proximos!!!
  7. Opa Vi que pelo menos sou conhecido xD Boa sorte a todos E espero realizar as expectativas de todos. @jv Po veio era segredo auhauha
  8. FIxado um erro no demon oak de movements Que não deixava o player começar a quest por favor peguem ele denovo
  9. ta na mão crie fonte.lua function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid,34000) == -1 then if getPlayerSex(cid) == 0 then doPlayerAddOutfit(cid,136,1) else doPlayerAddOutfit(cid,128,1) end else doPlayerSendTextMessage(cid,24,"Voce ja tem esse addon.") end end em actions.xml <action itemid="7540" script="fonte.lua" /> Porém peça na sessão correta q eu é pedido de scripts
  10. @all update para 1.1 @up ja tenho vc no msn o0
  11. tibiaa4e

    Notepad++

    SIm ele eh otimo Não sei como vivia sem ele Foi a maior invenção depois da privada com assento almofadado
  12. @all Estou vendo muitos problemas Em relação ao montar o script Nessa Sexta feira estarei disponibilizando o mapa e mais informações. Peço desculpa pela demora EH que tinha as aulas Agora estou de ferias e tenho mais tempo
  13. vc fala hi demon oak yes yes ai vc ja pega o hallowed axe Quanto a entrada ainda acho que tão errando o starting ending Cuidado para n fazer ele checar o sqm antes da arvore
  14. @rainbiow shield O erro do rainbow shield e causado no movements.xml retira os ids deles de lá que arruma Esse erro acho que foi arrumado no tfs 0.3.0 beta 1 A arvore so grita se vc pisar nos 5 em ordem certa. E o fato de não poder abrir a arvore deve ser pq vc erro as coordenadas de starting ending do hallowed axe.
  15. @schi Na moral veio, não fala o q n sabe auhahua Quem tem a ver o first item com meu script ? E o erro do movements eh q vc erro a tag no movements.xml no tem esse arquivo ou diretorio E pra vc falar com o npc se tem q pisar nos tile da arvore do lado @up auhauha pods crê ts rlz
  16. @up esses actionsids vão fazer ela dar um "grito", e vão adicionar o storage para vc provar ao npc q vc viu ela... Então adicione nos tile ao redor dela, ai qdo o player andar sobre ela vai falar algo O alber jose ate posto umas foto ai emcima
  17. @up seu ot é q versão do tfs ? E é só a arvore
  18. @up Sim TIpo quando vc der use com o axe na arvore ele vira uma pedra E nisso qdo se andar nela Ela volta a ser arvore para n entrar 2 espertinhos nela... (meio genial, pena que não foi minha ideia) Sim vc pode adicionar a função até mesmo nos arquivos É que o tfs eles é meio condenado ai criaram esse treco para n encher o global.lua de trankeira
  19. @ups O erro acima era porque no meu ot eu tenho um arquivo para as quests e eu uso uma função estranha o0 Ai eu fiz rapidinho e juntei 2 arquivo e esqueci de arruma os elseif. O do ALbert é memoria fraca Eu vou poder postar o mapa só la pra segunda Ai eu uso o z-tracker, e ele fica real... Agora to terminado a dream challenge porém ela é osso de explciar com adiciona pq é grande pra kcete
  20. @albert Opa vlw Eu vou ver se edito EH que não to em casa... Qdo for pra lá eu dou uma ajeitada
  21. @up opa depois qdo eu fazer o mapa eu vejo lah Tem a gravestone sim... Eu eskeci de avisar tem q ter a uniqueid 32194 e funfa tudo o treco de bater so q tem q ter os storage certo...
  22. Pequena atualização da Demon Oak para funcionar nos novos The Forgotten Server 0.4 Alguns scripts foram basedos na função do mazen Eu tentei fazer ela o mais simples possivel de adicionar Porém ficou ainda um pouco complicado mais tentarei simplificar ao maximo a explicação dela... Coloquei 2 tiles de gelo no mapa O tile mais acima é a posição do starting e o mais baixo e a direita é o ending. Porém esse tem uma borda A Unica coisa que falta no mapa é a gravestone que vc terá que fazer e colocar a uniqueid 32194 e configurar a newnposition Quando for passar para seu mapa, retire já que ele é apenas para saber. Spoiler 1º Para começar a quest você deve andar nas 5 posições que no meu mapa tem um treco amarelo nelas... 2º Depois vai até o npc oldrak e fale 3º Agora vá até a arena do demon oak e use o machado na arvore que bloquea o caminho. 4º Agora bata 9x em cada lugar da arvore. 5º Ao final ande no teleport. Se você andar nele antes de matar as quatro partes, vc terá que entrar e mata-la novamente as 4x. 6º Ao sair vai ao Oldrak e Fale : 7º Agora procure a gravestone de use nela E seja feliz com seu loot. Mudançass Aqui os uid, actions e storages usados : Ele é dividido em quatro arquivos : Para mapear crie uma area mais ou menos assim : Nessa area deverá haver apenas os items descritos e nomeados. De preferencia use o mapa do download. Na Tree Base adicione o actionids 32193 O tp 1 deve ter o uniqueid 32195 e deverá ter as coordenadas de saida, pois se o player não matar a arvore ele, sairá e terá que mata-la novamente. Também adicione a gosto a actionid 15001 ao redor da arvore do mal, esse actionids faz o player toma dano da arvore, como se ela batesse nele. Se vc conhece a quest, vc pode verificar que em certos pontos ao redor da arvore, ela "grita", vc deve adicionar os actionids 15002 até o 15006, em sentido anti horario. Começando a oeste. O resto está explicado nos arquivos. Você entenderá melhor se ver o spoil ou assistir algum video. Porém ela é muito simples de ser feita. A sala de recompensa vc deve adicionar os uids 2358 até 2361 nos baus, da esquerda para direita. Também não esqueça de colocar a gravestone com o uid 32194. Ao clicar nela vc irá para a sala de recompensa. Download do mapa Incrementando Em functions.lua ou global.lua adicione ao final: function doCreatureSayWithDistance(cid, position, text, type) oldPosX = setPlayerStorageValue(cid, 10000, getCreaturePosition(cid).x) oldPosY = setPlayerStorageValue(cid, 10001, getCreaturePosition(cid).y) oldPosZ = setPlayerStorageValue(cid, 10002, getCreaturePosition(cid).z) oldPos = { x = getPlayerStorageValue(cid, 10000), y = getPlayerStorageValue(cid, 10001), z = getPlayerStorageValue(cid, 10002) } doTeleportThing(cid, position, 0) doCreatureSay(cid, text, type) doTeleportThing(cid, oldPos, 0) return end function doSummonCreatures (monsters,positions) for _, positions in pairs (positions) do doSummonCreature(monsters, positions) end end function setPlayerMultiplyStorageValues(cid, storage, value) for _, storage in pairs(storage) do setPlayerStorageValue(cid, storage, value) end end Na pasta npc adicione oldrak.lua : <npc name="Oldrak" script="data/npc/scripts/oldrak.lua" walkinterval="2000" floorchange="0" access="3" level="1" maglevel="1"> <health now="150" max="150"/> <look type="57" head="115" body="113" legs="31" feet="38" addons="3" corpse="2212"/> <parameters> <parameter key="message_greet" value="Hello, |PLAYERNAME|!" /> <parameter key="message_needmoremoney" value="Try again when you have more money."/> <parameter key="message_decline" value="Why would you tease me like that?"/> </parameters> </npc> Em npcs/scripts adicione oldrak.lua : -- Demon Oak 2.1 by ta4e-- -- Paradox 1.0-- local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, 'demon oak') then if getPlayerStorageValue(cid, 15006) < 4 and getPlayerStorageValue(cid, 15005) == -1 then selfSay('You need know exactly location, go local and research more...' ,cid) elseif getPlayerStorageValue(cid, 15006) == 4 and getPlayerStorageValue(cid, 15005) == -1 then selfSay('You found the demon oak ? For kill it\'s you need a {Hallowed Axe}.', cid) elseif getPlayerStorageValue(cid, 15005) == -1 and getPlayerStorageValue(cid, 15006) <= 4 then selfSay('This a old demon , but we don\'t know where it\'s live.', cid) elseif getPlayerStorageValue(cid, 15005) == 3 then selfSay('Go defeat demon oak. When you do this report me.', cid) talkState[talkUser] = 0 elseif getPlayerStorageValue(cid, 15005) == 7 then selfSay('I can\'t believe, you really defeat the demon oak. Now is possible you get you reward. Search near cemitery.', cid) setPlayerStorageValue(cid,15005,8) talkState[talkUser] = 0 else selfSay('You need get a {Hallowed Axe}', cid) end elseif msgcontains(msg, 'mission') then if getPlayerStorageValue(cid, 15005) <= 8 then selfSay('First you need defeat the demon oak. Later you make next mission.', cid) elseif getPlayerStorageValue(cid, 15005) == 9 and getPlayerStorageValue(cid, 15031) ~= 2 then selfSay('The next mission, you need kill the demon, as named {Ungreez}. He\'s located in Hero Cave.', cid) setPlayerStorageValue(cid,15031,1) elseif getPlayerStorageValue(cid, 15031) == 2 then selfSay('Congratulations. Now you receive your outfit {Demon Hunter}.', cid) setPlayerStorageValue(cid,15031,2) if getPlayerSex(cid) == 0 then setPlayerStorageValue(cid,40288,1) else setPlayerStorageValue(cid,40289,1) end end elseif msgcontains(msg, 'hallowed axe') then if getPlayerStorageValue(cid, 15005) == -1 then selfSay('I can forge this but i need {1000 gold coins} and a {axe}. You interessed ?', cid) talkState[talkUser] = 1 elseif getPlayerStorageValue(cid, 15005) == 1 then selfSay('Great. You have 1000 gold coins to give me ?.', cid) talkState[talkUser] = 2 elseif getPlayerStorageValue(cid, 15005) == 2 then selfSay('Great. Now you have a {axe} to me ?.', cid) talkState[talkUser] = 3 end elseif msgcontains(msg, 'hugo') then selfSay('Ah, the curse of the Plains of Havoc, the hidden beast, the unbeatable foe. I\'ve been living here for years and I\'m sure this is only a {myth}.', cid) talkState[talkUser] = 4 elseif talkState[talkUser] == 4 then if msgcontains(msg, 'myth') then selfSay('There are many tales about the fearsome Hugo. It\'s said it\'s an abnormality, accidentally created by {Yenny the Gentle}. It\'s half demon, halfsomething else and people say it\'s still alive after all these years.', cid) talkState[talkUser] = 5 end elseif talkState[talkUser] == 5 then if msgcontains(msg, 'yenny the gentle') then selfSay('Yenny, known as the Gentle, was one of the most powerful wielders of magic in ancient times. She was known throughout the world for her mercy and kindness.', cid) setPlayerStorageValue(cid,15200,1) end elseif talkState[talkUser] == 1 then if msgcontains(msg, 'yes') then selfSay('Great. You have 1000 gold coins to give me ?.', cid) setPlayerStorageValue(cid,15005,1) talkState[talkUser] = 2 else selfSay('When you prepared regress to me.', cid) end elseif talkState[talkUser] == 2 then if msgcontains(msg, 'yes') then if(doPlayerRemoveMoney(cid, 1000) == TRUE) then selfSay('Great. Now you have a {axe} to me ?.', cid) setPlayerStorageValue(cid,15005,2) talkState[talkUser] = 3 else selfSay('You don\'t have a money.', cid) end end elseif talkState[talkUser] == 3 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid,2386,1) == TRUE then selfSay('Great. Now go and defeat a Demon Oak. Later report me.', cid) doPlayerAddItem(cid,8293,1) setPlayerStorageValue(cid,15005,3) talkState[talkUser] = 3 else selfSay('You don\'t have a axe.', cid) end else selfSay('When you prepared regress to me.', cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Agora vamos em actions/scripts e adicione hallowed axe.lua : Nos monster vc escolhe os monstros que a arvore irá sumonar. Em monstros alternativos se vc ativar o altmo, os monstros listado ali abaixo Serão sorteados com o acima, gerando mais emoção e também sorte ou azar ao player. --Demon Oak 2.1 by Ta4e-- --Some scripts based in script of Mazen-- function onUse(cid, item, frompos, item2, topos) local monster1 = "Crypt Shambler" local monster2 = "Lich" local monster3 = "bone beast" local monster4 = "banshee" local monster5 = "giant spider" local boss1 = "Blightwalker" local boss2 = "Betrayed Wraith" local boss3 = "diabolic imp" local boss4 = "demon" basepos = {x=1867, y=975, z=7} local starting={x=1856, y=966, z=7, stackpos=253} local ending={x=1883, y=982, z=7, stackpos=253} local trash= {x=1169, y=725, z=13} --Alternative Monsters--------------------------------------------------------------- local altmo = 0 -- If it 0 monsters not randomize. If it 1 randomize with this \/ local altmonst1 = "braindeath" local altmonst2 = "necromancer" local altmonst3 = "vampire" local altmonst4 = "giant spider" local altmonst5 = "demon skeleton" local altboss1 = "plaguesmith" local altboss2 = "phantasm" local altboss3 = "hellhound" local altboss4 = "behemoth" ----------------------------------------------------------------------------------------------- if altmo == 1 then if math.random (1,5) == 1 or math.random (1,5) == 5 then monster1 = altmonst1 monster2 = altmonst2 monster5 = altmonst5 boss1 = altboss1 boss3 = altboss3 else monster3 = altmonst3 monster4 = altmonst4 boss2 = altboss2 boss4 = altboss4 end end local fourposition1 = {x=basepos.x-4, y=basepos.y-4, z=7} local fourposition2 = {x=basepos.x-4, y=basepos.y+1, z=7} local fourposition3 = {x=basepos.x+3, y=basepos.y-4, z=7} local fourposition4 = {x=basepos.x+3, y=basepos.y+1, z=7} local modpos1 = {x=basepos.x-3, y=basepos.y-5, z=7} local modpos2 = {x=basepos.x, y=basepos.y-4, z=7} local modpos3 = {x=basepos.x+2, y=basepos.y-5, z=7} local threeposition1 = {x=basepos.x+3, y=basepos.y+4, z=7} local threeposition2 = {x=basepos.x+5, y=basepos.y+4, z=7} local threeposition3 = {x=basepos.x+3, y=basepos.y+5, z=7} local twopos ={x=basepos.x+5, y=basepos.y+1, z=7} local twopos1 = {x=basepos.x+2, y=basepos.y+2, z=7} local doublepos = {x=basepos.x-3, y=basepos.y-1, z=7} local leftpos = {x=basepos.x-4, y=basepos.y-5, z=7} local crepos = {x=basepos.x-3, y=basepos.y-7, z=7} local gopos = {x=basepos.x-2, y=basepos.y-17, z=7} ------------------------------------------------------------------------------------------------------------------------------ local gtotal = getPlayerStorageValue(cid, 15005) local gcorvo = getPlayerStorageValue(cid, 15001) local gleft = getPlayerStorageValue(cid, 15002) local gright = getPlayerStorageValue(cid, 15003) local gface = getPlayerStorageValue(cid, 15004) checking={x=starting.x, y=starting.y, z=starting.z, stackpos=starting.stackpos} if item2.itemid == 2717 and item2.uid == 32193 then if getPlayerLevel(cid) >= 120 then players=0 totalmonsters=0 monster = {} repeat creature= getThingfromPos(checking) if creature.itemid > 0 then if getPlayerAccess(creature.uid) == 0 then players=players+1 end if getPlayerAccess(creature.uid) ~= 0 and getPlayerAccess(creature.uid) ~= 3 then totalmonsters=totalmonsters+1 monster[totalmonsters]=creature.uid end end checking.x=checking.x+1 if checking.x>ending.x then checking.x=starting.x checking.y=checking.y+1 end until checking.y>ending.y if players==0 then current=0 repeat current=current+1 doTeleportThing(monster[current],trash) until current>=totalmonsters doTeleportThing(cid, topos, 0) setPlayerMultiplyStorageValues(cid,{15001,15002,15003,15004},1) doTransformItem(item2.uid, 3669) doCreateTeleport(1387, gopos, crepos) local getrem1 = getThingfromPos({x=basepos.x-3, y=basepos.y-7, z=7, stackpos = 3}) doSetItemActionId(getrem1.uid,32195) end else doPlayerSendTextMessage(cid, "You need level 120 to enter in arena.", result) end elseif item2.itemid == 8288 then if gcorvo <10 then effect (cid,15001,gcorvo,topos) if gcorvo == 3 then doSummonCreatures(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gcorvo == 5 then doSummonCreatures(monster2, {threeposition1,threeposition2,threeposition3}) elseif gcorvo == 7 then doSummonCreature(boss1, fourposition3) elseif gcorvo == 9 then gtotal = gtotal + 1 setPlayerStorageValue(cid, 15005,gtotal) end else doSendMagicEffect(topos, 2) end elseif item2.itemid == 8289 then if gleft <10 then effect (cid,15002,gleft,topos) if gleft == 3 then doSummonCreature(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gleft == 4 then doSummonCreatures(monster3, {modpos1,modpos2,modpos3}) doSummonCreature(monster3, fourposition2) elseif gleft == 7 then doSummonCreatures(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gleft == 9 then doSummonCreature(boss2, leftpos) gtotal = gtotal + 1 setPlayerStorageValue(cid, 15005,gtotal) end else doSendMagicEffect(topos, 2) end elseif item2.itemid == 8290 then if gright <10 then effect (cid,15003,gright,topos) if gright == 2 then doSummonCreatures(monster4, {twopos,twopos1}) elseif gright == 4 then doSummonCreatures(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gright == 7 then doSummonCreatures(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gright == 9 then doSummonCreature(boss3,leftpos) gtotal = gtotal + 1 setPlayerStorageValue(cid, 15005,gtotal) end else doSendMagicEffect(topos, 2) end elseif item2.itemid == 8291 then if gface <10 then effect (cid,15004,gface,topos) if gface == 1 then doSummonCreature(monster2, doublepos) doSummonCreature(monster5, fourposition2) elseif gface == 4 then doSummonCreatures(monster1, {fourposition1,fourposition2,fourposition3,fourposition4}) elseif gface == 6 then doSummonCreature(boss4, leftpos) elseif gface == 9 then gtotal = gtotal + 1 setPlayerStorageValue(cid, 15005,gtotal) end else doSendMagicEffect(topos, 2) end end end local function effect (cid,storage,valor,topos) valor = getPlayerStorageValue(cid, storage) doTargetCombatHealth(0, cid, COMBAT_EARTHDAMAGE, -300, -300, CONST_ME_BIGPLANTS) valor = valor + 1 setPlayerStorageValue(cid, storage,valor) doSendMagicEffect(topos, 0) end Na mesma pasta adicione o Demon oak.lua : --Demon Oak 2.1 by Ta4e-- --Some scripts based in script of Mazen-- function onUse(cid, item, fromPosition, itemEx, toPosition) newnPosition = {x=1904, y=1006, z=8} -- Aqui a posição da sala de recompensa if item.uid == 32194 and getPlayerStorageValue(cid,15005) == 8 then doTeleportThing(cid,newnPosition) doSendMagicEffect(newnPosition,10) elseif item.uid == 2358 then if getPlayerStorageValue(cid,2358) == -1 and getPlayerStorageValue(cid,15005) == 8 then if getPlayerFreeCap(cid) >= 54.00 then doPlayerSendTextMessage(cid,24,"You have found demon legs.") doPlayerAddItem(cid,2495,1) setPlayerMultiplyStorageValues (cid,{2358,15005},1) else doPlayerSendTextMessage(cid,24,"You have found a demon legs. Weighing 54.00 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end elseif item.uid == 2359 then if getPlayerStorageValue(cid,2358) == -1 and getPlayerStorageValue(cid,15005) == 8 then if getPlayerFreeCap(cid) >= 69.00 then doPlayerSendTextMessage(cid,24,"You have found rainbow shield.") doPlayerAddItem(cid,8905,1) setPlayerMultiplyStorageValues (cid,{2358,15005},1) else doPlayerSendTextMessage(cid,24,"You have found a rainbow shield. Weighing 69.00 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end elseif item.uid == 2360 then if getPlayerStorageValue(cid,2358) == -1 and getPlayerStorageValue(cid,15005) == 8 then if getPlayerFreeCap(cid) >= 12.00 then doPlayerSendTextMessage(cid,24,"You have found royal crossbow.") doPlayerAddItem(cid,8851,1) setPlayerMultiplyStorageValues (cid,{2358,15005},1) else doPlayerSendTextMessage(cid,24,"You have found a royal crossbow. Weighing 12.00 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end elseif item.uid == 2361 then if getPlayerStorageValue(cid,2358) == -1 and getPlayerStorageValue(cid,15005) == 8 then if getPlayerFreeCap(cid) >= 28.50 then doPlayerSendTextMessage(cid,24,"You have found a spellbook of dark mysteries.") doPlayerAddItem(cid,8918,1) setPlayerMultiplyStorageValues (cid,{2358,15005},1) else doPlayerSendTextMessage(cid,24,"You have found spellbook of dark mysteries. Weighing 28.50 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end end end E em actions.xml adicione : <action itemid="8293" script="Hallowed Axe.lua"/> <action uniqueid="32194" script="demon oak.lua" /> <action uniqueid="2358" script="demon oak.lua" /> <action uniqueid="2359" script="demon oak.lua" /> <action uniqueid="2360" script="demon oak.lua" /> <action uniqueid="2361" script="demon oak.lua" /> Finalmente em movements/scripts adicione demon oak.lua : --Demon Oak 2.1 by Ta4e-- --Some scripts based in script of Mazen-- function onStepOut(cid, item, position, fromPosition) if item.uid == 32193 and item.itemid == 3669 then doTransformItem(item.uid,2717) end end function onStepIn(cid, item, position, fromPosition) local yell = getPlayerStorageValue(cid, 15006) local pos1= {x=1866, y =973, z=7} if item.actionid == 32195 and item.itemid == 1387 then if getPlayerStorageValue(cid, 15005) == 7 then doPlayerSendTextMessage(cid,21,"Tell Oldrak about your great victory against the demon oak.") else doPlayerSendTextMessage(cid,21,"You have escaped of Demon Oak.") setPlayerMultiplyStorageValues (cid,{15001,15002,15003,15004,15005},1) end end if getPlayerStorageValue(cid, 15006) < 4 then if isPlayer(cid) == TRUE then yell = yell + 1 if item.actionid == 15005 and getPlayerStorageValue(cid, 15006) == -1 then setPlayerStorageValue(cid, 15006,yell) doCreatureSayWithDistance(cid, pos1, "Find a way in here and release me! Pleeeease hurry!",TALKTYPE_ORANGE_1 ) elseif item.actionid == 15002 and getPlayerStorageValue(cid, 15006) == 0 then setPlayerStorageValue(cid, 15006,yell) doCreatureSayWithDistance(cid, pos1, "I can bring your beloved back from the dead,just release me!",TALKTYPE_ORANGE_1 ) elseif item.actionid == 15003 and getPlayerStorageValue(cid, 15006) == 1 then setPlayerStorageValue(cid, 15006,yell) doCreatureSayWithDistance(cid, pos1, "What is this? Demon legs lying here? Someone might have lost them.",TALKTYPE_ORANGE_1 ) elseif item.actionid == 15004 and getPlayerStorageValue(cid, 15006) == 2 then setPlayerStorageValue(cid, 15006,yell) doCreatureSayWithDistance(cid, pos1, "I'm trapped come here and free me, fast!!!",TALKTYPE_ORANGE_1 ) elseif item.actionid == 15005 and getPlayerStorageValue(cid, 15006) == 3 then setPlayerStorageValue(cid, 15006,yell) doCreatureSayWithDistance(cid, pos1, "What a nice and shinny golden armor. Come to me and you can have it!",TALKTYPE_ORANGE_1 ) end end elseif item.actionid == 15001 then if isPlayer(cid) == TRUE then if getPlayerStorageValue(cid, 15005) <=7 then if math.random(1,4) == 1 then doTargetCombatHealth(0, cid, COMBAT_EARTHDAMAGE, -500, -500, CONST_ME_BIGPLANTS) end end end end end Em movements.xml adicione : <movevent event="StepOut" uniqueid="32193" script="demon oak.lua" /> <movevent event="StepIn" uniqueid="32195" script="demon oak.lua" /> <movevent event="StepIn" actionid="15000" script="demon oak.lua" /> <movevent event="StepIn" actionid="15001" script="demon oak.lua" /> <movevent event="StepIn" actionid="15002" script="demon oak.lua" /> <movevent event="StepIn" actionid="15003" script="demon oak.lua" /> <movevent event="StepIn" actionid="15004" script="demon oak.lua" /> <movevent event="StepIn" actionid="15005" script="demon oak.lua" /> <movevent event="StepIn" actionid="15006" script="demon oak.lua" /> Caso seja The Forgotten Server 0.4.2 <movevent type="StepOut" uniqueid="32193" event="script" value="dotile.lua" /> <movevent type="StepIn" actionid="32195" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15000" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15001" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15002" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15003" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15004" event="script" value="demon oak.lua" /> <movevent type="StepIn" actionid="15005" event="script" value="demon oak.lua" /> --UPDATE-- Eu acabei esquecendo de uma coisa que arruma alguns bugs caso o player empacote (morra) Em creaturescripts/scritps no player death.lua depois de: function onDeath(cid, corpse, killer) Adicione : setPlayerStorageValue(cid,5002,0) setPlayerStorageValue(cid,5001,0) setPlayerStorageValue(cid,5000,0) Isso evita que o player não possa entrar na quest e desfaz alguns bugs... Se você é anormal como eu, pode querer adicionar no Quest Log essa quest para ajudar os players Então em XML/quests.xml depois de: <quests> Adicione : <quest name="The Ultimate Challenges" startstorageid="15005" startstoragevalue="1"> <mission name="The Demon Oak" storageid="15005" startvalue="1" endvalue="9"> <missionstate id="1" description="You need give 1000 gold coins for Oldrak make a Hallowed Axe"/> <missionstate id="2" description="Now give axe to Oldrak make a Hallowed Axe"/> <missionstate id="3" description="Go defeat the Demon Oak."/> <missionstate id="4" description="You now killing The Demon Oak. Left 3 of 4 Parts."/> <missionstate id="5" description="You now killing The Demon Oak. Left 2 of 4 Parts."/> <missionstate id="6" description="You now killing The Demon Oak. Left 1 of 4 Parts."/> <missionstate id="7" description="Now the Demon Oak are dead. Report to oldrak."/> <missionstate id="8" description="Found a gravestone to choose your reward."/> <missionstate id="9" description="Congratulations. You have finished the quest"/> </mission> </quest> Pra adicionar o encantamento do rainbow shield entre em http://www.xtibia.com/forum/84-Enchant-Sys...ld-t103742.html
  23. @BUGH reward pos é ele irá depois q matar op ultimo buss o stackpós 253 é pra mexer com player deve deixar assim msm
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...