Todas Atividades

Atualizada automaticamente   

  1. Ontem
  2. Direto ao ponto: Passei 3 itens quaisquer pra um jogador (voluntário). Em seguida, ele me passou de volta os 3 mesmos itens. Fiz a consulta no banco de dados e retornou o seguinte: MariaDB [dsro_db]> SELECT * FROM `trade_log` ORDER BY `Date` DESC LIMIT 20; +-------+---------------------+----------+-----------+-------------------------+---------+---------+----------------+-----------+-------------------------+---------+---------+----------------+-----------+--------+-----------+-------------------------+-----------------+-----------+-----------+-----------+-----------+-------------------+ | Index | Date | Mapname | P1_CharID | P1_Name | P1_PosX | P1_PosY | P1_IP | P2_CharID | P2_Name | P2_PosX | P2_PosY | P2_IP | Zeny | ItemID | ItemCount | ItemName | ItemSerial | ItemSlot1 | ItemSlot2 | ItemSlot3 | ItemSlot4 | ItemRefiningLevel | +-------+---------------------+----------+-----------+-------------------------+---------+---------+----------------+-----------+-------------------------+---------+---------+----------------+-----------+--------+-----------+-------------------------+-----------------+-----------+-----------+-----------+-----------+-------------------+ | 2526 | 2018-06-18 18:52:35 | prontera | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.229.81.xxx | 158020 | LipESprY | 160 | 183 | xxx.229.81.xxx | 0 | 0 | 0 | UNKNOWN_ITEM | 0 | 0 | 0 | 0 | 0 | 0 | | 2527 | 2018-06-18 18:52:35 | prontera | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.229.81.xxx | 158020 | LipESprY | 160 | 183 | xxx.229.81.xxx | 0 | 0 | 0 | UNKNOWN_ITEM | 0 | 0 | 0 | 0 | 0 | 0 | | 2528 | 2018-06-18 18:52:35 | prontera | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.229.81.xxx | 158020 | LipESprY | 160 | 183 | xxx.229.81.xxx | 0 | 0 | 0 | UNKNOWN_ITEM | 0 | 0 | 0 | 0 | 0 | 0 | | 2523 | 2018-06-18 18:51:58 | prontera | 158020 | LipESprY | 160 | 183 | xxx.223.12.xx | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.223.12.xx | 0 | 7348 | 1 | Cartão Vip | 0 | 0 | 0 | 0 | 0 | 0 | | 2524 | 2018-06-18 18:51:58 | prontera | 158020 | LipESprY | 160 | 183 | xxx.223.12.xx | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.223.12.xx | 0 | 616 | 1 | Velho Álbum de Cartas | 0 | 0 | 0 | 0 | 0 | 0 | | 2525 | 2018-06-18 18:51:58 | prontera | 158020 | LipESprY | 160 | 183 | xxx.223.12.xx | 157701 | Nö Påin † Nö Gåin | 159 | 183 | xxx.223.12.xx | 0 | 1234 | 1 | Walgwanggum | 678690732113942 | 0 | 0 | 0 | 0 | 0 | [...] +-------+---------------------+----------+-----------+-------------------------+---------+---------+----------------+-----------+-------------------------+---------+---------+----------------+-----------+--------+-----------+-------------------------+-----------------+-----------+-----------+-----------+-----------+-------------------+ No primeiro trade, em que passo os itens pro cara, tudo ficou registrado como deve ser. No segundo trade, em que ele me devolve os itens, fica quase tudo errado: IP do P1 e P2 ficam o mesmo, quantidade do item (ItemCount) e ID do item (ItemID) ficam 0 (zero) e nome do item (ItemName) fica "UNKNOWN_ITEM". PS: Censurei os IPs por motivos óbvios. Fico à disposição voluntariar no que for necessário. Vlw!
  3. Só pra estender um pouco o tutorial, podes também criar um script para inicializar o servidor com os consoles separados. Fica bem semelhante ao que acontece no Windows: #1 - Crie um arquivo de texto com seu editor favorito. Costumo usar o "nano": $ cd /home $ nano iniciar-servidor Repare que antes de criar o arquivo, entramos no diretório /home #2 - Cole o seguinte código no arquivo: #!/bin/bash screen -d -m -S login bash -c 'cd /home/emulador && ./login-server' screen -d -m -S char bash -c 'cd /home/emulador && ./char-server' screen -d -m -S map bash -c 'cd /home/emulador && ./map-server' Repare que o caminho da pasta do meu emulador é " /home/emulador ". Altere conforme o seu. #3 - Vamos adicionar a permissão de execução no arquivo que acabamos de criar - a fim de evitar problemas relacionados a tal: $ chmod u+x iniciar-servidor #4 - Com o seu servidor desligado, simplesmente rode o arquivo com o "bash" - claro que vamos executar isso no diretório que o criamos (/home): $ ./iniciar-servidor Após isso, basta abrir (attach) a screen referente ao console que desejar consultar/monitorar! Seu servidor já está iniciado com as telas separadinhas: $ screen -r login $ screen -r char $ screen -r map Claro que vc vai fechar (dettach) uma screen antes de ir pra outra, blz?! Considerações finais: • O símbolo $ no início do comando significa que vc pode executar sem a necessidade de privilégios de administrador (sudo); • Pode-se criar um serviço para rodar seu servidor automaticamente, caso seu host seja reiniciado fora de seu planejamento (Queda de energia, manutenção, e bla, bla, bla) - Pesquise no google de acordo com o Linux que vc usa; • Pra retornar uma lista de todos as telas (screen) ativas, basta rodar o seguinte comando: $ screen -ls • Se sua conexão cair enquanto vc está com uma sessão aberta (screen), ao reconectar-se não vai ter acesso ao console referente a tal sessão do screen. Tanto que ao listar as sessões, vc verá uma com status "Attached". Daí basta rodar o comando pra sair da sessão e entrar nela novamente. • Se seguir as dicas certinho e ainda assim falhar, provável que vc não tenha a permissão de execução nos arquivos login-server / char-server / map-server. Daí basta rodar os seguintes comandos: $ chmod u+x login-server $ chmod u+x char-server $ chmod u+x map-server
  4. kk rlx, deixa os ids como falei acima, assim que acordar eu vejo o que consigo fazer
  5. Vai descansar cabeção hahaha
  6. kkkk nossa aoskdaposdk tô rindo muito, pq tipo eu quebrei a cabeça pra resolver um erro de lógica que eu tava fazendo aaosdkpoasdk pensa q levei algumas horas pra arrumar o código kkk mas ainda sim da pra usar ele, vou modificar e ver o quê consigo, só queria um favor, postar os ids certo mesmo que seja só pra eu ter a base, pq eu não dormi nada praticamente e tô com o raciocínio nivel 0 agora kkkk cabeça fica viajando
  7. Me envia o seu modelo pra eu entender como você ta fazendo, pq acho que da pra fazer um loop pra estar sempre verificando se o player está parado ou se movendo, usando o attachrid().
  8. Fácil pegar todos os ids. Só lançar a seguinte query mysql: SELECT * FROM item_db WHERE script like ('%heal%'); No caso isso retorna todas as linhas que o script cure. Acho que isso resolve. Quando der eu transformo isso com uma expressão regular pro formato do map_zone e posto aqui para se alguém precisar no futuro. @Edit Fiz aqui no serviço mesmo. https://pastebin.com/Danjvi6j Não testei porque não da de logar in-game aqui. Esses são os itens da brathena pre-renewal. Se alguém precisar da renewal ou o pastebin não funcionar em algum dia, fiz o seguinte: Abri o bra_db, utilizei a query abaixo: SELECT name_english FROM item_db WHERE script like ('%heal%'); Exportei para um arquivo .txt, depois é só abrir o arquivo com o sublime, apertar alt+h (para abrir o modo de substituição), cliquei no asterisco que aparece na barra (para ativar o modo regex) e substitui: (.*)\n Por: $1: true,\n
  9. Boa. No meu caso para solucionar peguei a luafiles514 da data do mihael. Descobrindo o erro algum colaborador (cof cof ou ex colaborador) que tenha contato com os desenvolvedores podiam pedir para commitar no git. A maioria das pessoas que estão começando pegam a data que está lá.
  10. Então, queria que os jogadores caíssem aleatoriamente no mapa (fácil até então), e em certos momentos os jogadores que estiverem em um lugar do mapa perdem o mini-game. * Não da de utilizar o OnTouch, pois se os jogadores ficarem parado no mapa o OnTouch não ativa. E o local também é muito dinâmico, muda quase todo segundo. Consegui achar o getmapxy. Posso eu mesmo gravar o array e pesquisar com o getmapxy. Na hora que o jogador entrar no evento o npc grava o id dele em um array, e durante o evento o npc fica dando um for usando o getmapxy. Meu problema agora é que o getmapxy não funcionou. Está retornando sempre 0,0 Estou no serviço agora então não consigo te enviar como eu tentei direitinho, mas passei os parâmetros corretos. Imagino que se você me der um exemplo do getmapxy funcionando no brathena eu consigo fazer o resto Hyroshima
  11. hey Hyroshima.. haha caramba! Obrigado pelo auxilio. Ali ao mostrar o menu, na verdade, oque que estou buscando é, fazer um menu mas com os itens que o player tem. acho que não expliquei bem, ou talvez nem seja possivel fazer isso... Na parte do : mes "Qual desses itens você vai levar para casa hoje?"; na verdade seria : "Deixe-me ver quantos itens/frutas você tem:" Então abre o menu, mas com o nome da fruta + quantidade que o player tem. o array das frutas de level 1 guarda os id's das frutas de level 1 se o player tiver alguma delas, Então, cria-se um menu com nome e a quantidade que ele tem, tipo: - maça [12] -banana [5] -uva[7] Ai, ao clicar em maçã[12] por exemplo, ele troca 2 maça por 1 doce de maçã. (deleta 2 maças e da 1 doce de maça pro player ) hahahahah dai, ao abrir novamente o npc, ele vai estar maça[10] Mas não sei se da pra fazer um menu assim, com os itens que o player tem.
  12. Iawe ^^, fiz um exemplo bem funcional, apesar de parecer grotesco está 100%, normalmente eu crio o code do jeito que vou imaginando, faço as correções e depois uma lida no código pra ver se não tem nada errado, e depois eu estudo a otimização do mesmo para reduzir a quantidade de code e melhorar o sistema etc, nesse caso eu pulei a otimização pq tou sem tempo ^^. prontera,155,179,5 script Vendedor de Frutas 4_F_07,{ mes "[ Vendedor de Frutas ]"," "; mes "Olá freguês, fique a vontade para escolher a qualidade da fruta!"; next; switch(select("de Primeira Qualidade:de Segunda Qualidade:de Terceira Qualidade")) { case 1: mes "[ Vendedor de Frutas ]"," "; mes "Qual desses itens você vai levar para casa hoje?"; for(set [email protected],0; [email protected]<getarraysize(.fMake_one); set [email protected],[email protected]+2){ set [email protected]$,[email protected]$+(.fMake_one[([email protected]+1)]+"x "+getitemname(.fMake_one[[email protected]])+":"); } set [email protected],select([email protected]$); switch([email protected]) { case 1: set [email protected],0; break; case 2: set [email protected],2; break; case 3: set [email protected],4; break; default: mes "Algo deu errado !"; close; } callsub S_FruitAll,1,[email protected]; break; case 2: mes "[ Vendedor de Frutas ]"," "; mes "Qual desses itens você vai levar para casa hoje?"; for(set [email protected],0; [email protected]<getarraysize(.fMake_two); set [email protected],[email protected]+2){ set [email protected]$,[email protected]$+(.fMake_two[([email protected]+1)]+"x "+getitemname(.fMake_two[[email protected]])+":"); } set [email protected],select([email protected]$); switch([email protected]) { case 1: set [email protected],0; break; case 2: set [email protected],2; break; default: mes "Algo deu errado !"; close; } callsub S_FruitAll,2,[email protected]; break; case 3: mes "[ Vendedor de Frutas ]"," "; mes "Qual desses itens você vai levar para casa hoje?"; for(set [email protected],0; [email protected]<getarraysize(.fMake_thr); set [email protected],[email protected]+2){ set [email protected]$,[email protected]$+(.fMake_thr[([email protected]+1)]+"x "+getitemname(.fMake_thr[[email protected]])+":"); } set [email protected],select([email protected]$); switch([email protected]) { case 1: set [email protected],0; break; case 2: set [email protected],2; break; default: mes "Algo deu errado !"; close; } callsub S_FruitAll,3,[email protected]; break; } close; S_FruitAll: if(!getarg(0)) return; next; switch(getarg(0)) { case 1: mes "[ Vendedor de Frutas ]"; mes "Você escolheu:", "[ "+.fMake_one[(getarg(1)+1)]+"x "+getitemname(.fMake_one[getarg(1)])+" ]", "Traga-me:", "[ "+.freqt_one[(getarg(1)+1)]+"x "+getitemname(.freqt_one[getarg(1)])+" ]", "nos podemos continuar?"; if(select("Sim, podemos!:Nao...melhor nao...")==2) { mes "Ok, até mais."; close; } if(countitem(.freqt_one[getarg(1)]) < .freqt_one[(getarg(1)+1)]) { next; mes "[ Vendedor de Frutas ]"," "; mes "Desculpe "+strcharinfo(0)+", mas você não possui material necessário!"; close; } if(!checkweight(.freqt_one[getarg(1)],.freqt_one[(getarg(1)+1)])) { mes "Você está carregando muito peso.."; mes "desculpe."; close; } next; mes "[ Vendedor de Frutas ]"," "; mes "Pronto."; mes "Ai está seu novo alimento!"; delitem .freqt_one[getarg(1)],.freqt_one[(getarg(1)+1)]; getitem .fMake_one[getarg(1)],.fMake_one[(getarg(1)+1)]; close; case 2: mes "[ Vendedor de Frutas ]"; mes "Você escolheu:", "[ "+.fMake_two[(getarg(1)+1)]+"x "+getitemname(.fMake_two[getarg(1)])+" ]", "Traga-me:", "[ "+.freqt_two[(getarg(1)+1)]+"x "+getitemname(.freqt_two[getarg(1)])+" ]", "nos podemos continuar?"; if(select("Sim, podemos!:Nao...melhor nao...")==2) { mes "Ok, até mais."; close; } if(countitem(.freqt_two[getarg(1)]) < .freqt_two[(getarg(1)+1)]) { next; mes "[ Vendedor de Frutas ]"," "; mes "Desculpe "+strcharinfo(0)+", mas você não possui material necessário!"; close; } if(!checkweight(.freqt_two[getarg(1)],.freqt_two[(getarg(1)+1)])) { mes "Você está carregando muito peso.."; mes "desculpe."; close; } next; mes "[ Vendedor de Frutas ]"," "; mes "Pronto."; mes "Ai está seu novo alimento!"; delitem .freqt_two[getarg(1)],.freqt_two[(getarg(1)+1)]; getitem .fMake_two[getarg(1)],.fMake_two[(getarg(1)+1)]; close; case 3: mes "[ Vendedor de Frutas ]"; mes "Você escolheu:", "[ "+.fMake_thr[(getarg(1)+1)]+"x "+getitemname(.fMake_thr[getarg(1)])+" ]", "Traga-me:", "[ "+.freqt_thr[(getarg(1)+1)]+"x "+getitemname(.freqt_thr[getarg(1)])+" ]", "nos podemos continuar?"; if(select("Sim, podemos!:Nao...melhor nao...")==2) { mes "Ok, até mais."; close; } if(countitem(.freqt_thr[getarg(1)]) < .freqt_thr[(getarg(1)+1)]) { next; mes "[ Vendedor de Frutas ]"," "; mes "Desculpe "+strcharinfo(0)+", mas você não possui material necessário!"; close; } if(!checkweight(.freqt_thr[getarg(1)],.freqt_thr[(getarg(1)+1)])) { mes "Você está carregando muito peso.."; mes "desculpe."; close; } next; mes "[ Vendedor de Frutas ]"," "; mes "Pronto."; mes "Ai está seu novo alimento!"; delitem .freqt_thr[getarg(1)],.freqt_thr[(getarg(1)+1)]; getitem .fMake_thr[getarg(1)],.fMake_thr[(getarg(1)+1)]; close; } return; OnInit: //Limpa as array deletearray .fMake_one[0],getarraysize(.fMake_one); deletearray .freqt_one[0],getarraysize(.freqt_one); deletearray .fMake_two[0],getarraysize(.fMake_one); deletearray .freqt_two[0],getarraysize(.freqt_one); deletearray .fMake_thr[0],getarraysize(.fMake_one); deletearray .freqt_thr[0],getarraysize(.freqt_one); //Niveis // Nivel 1 setarray .fMake_one[0],607,5,608,10,559,5; //ID,QTD Item que será entregue setarray .freqt_one[0],521,15,531,20,558,10; //ID,QTD Item que será necessário // Nivel 2 setarray .fMake_two[0],609,2,610,3; //ID,QTD Item que será entregue setarray .freqt_two[0],523,5,518,10; //ID,QTD Item que será necessário // Nivel 3 setarray .fMake_thr[0],611,5,612,20; //ID,QTD Item que será entregue setarray .freqt_thr[0],517,20,519,10; //ID,QTD Item que será necessário end; }
  13. Descobri o problema, na pasta data do BRATHENA tem um arquivo com extensão mapinfotable."scp" , modifiquei para mapinfotable.txt e o hexed abriu ! podem fechar o tópico.
  14. Meu hexed está fechando assim que abre. Estou usando tudo padrão. Diffei o hexed com os diffs recomendados. Estou usando: 2014-10-22bRagexe Quando eu tento executar o hexed somente com a data.grf . > jogo abre normalmente para o bRO. Quando coloco para ler a data primeiro, o jogo abre e fecha, sem nenhum erro. Já colei todos os arquivos lua514 dentro da data Já tentei usando a opção no diff read data first, e sem ela (com uma custom_data.grf) Meu clientinfo.xml está do mesmo jeito que estava quando baixei a data (nem o ip alterei ainda). Teria que fazer alguma modificação na version ou langtype para funcionar com o hexed da data?
  15. Oi pessoal Eu sou ruim com scripts Então eu fiz a lógica de um NPC e estou procurando ajuda para construir. Se alguém souber... É um npc que verifica se o jogador tem algumas frutas. Então, através de um Menu, mostra o nome da fruta (+ quantidade) que o jogador possui. Então, o jogador seleciona o alimento que ele quer trocar. Existem 3 níveis de comida. (pretendo adicionar mais frutas, mais níveis, etc... ) (Há muitas coisas erradas aí na lógica acho, mas como eu disse, é apenas o raciocínio pra construção.) //Legenda: // // == fruits ID: // // apple:40010 // banana:40011 // abobora:40012 // // == fruit candy ID: // // apple candy:40020 // banana candy:40021 // pumpkin candy:40022 // // = fruit food ID // // apple food:40030 // banana food:40031 // pumpkin food:40032 switch ( select ("Level 1","Level 2","Level 3","Cancelar.") ) { case 1: setarray @fruits[0],40010,40011,40012; for(@i=0, @i < @fruits[0], @i++ ){ //para percorrer o array if(countitem(@fruits[@i]) // adiciona o ID da fruta que o jogador possui em alguma variável? // precisa armazenar os frutos encontrados em um novo array? } callsub MakeFood; break; case 2: setarray @fruits[0],40020,40021,40022; for(@i=0, @i < @fruits[0], @i++ ){ //para percorrer o array if(countitem(@fruits[@i]) // adiciona o ID da fruta que o jogador possui em alguma variável? // precisa armazenar os frutos encontrados em um novo array? } callsub MakeFood; break; case 3: setarray @fruits[0],40030,40031,40032; for(@i=0, @i < @fruits[0], @i++ ){ //para percorrer o array if(countitem(@fruits[@i]) // adiciona o ID da fruta que o jogador possui em alguma variável? // precisa armazenar os frutos encontrados em um novo array? } callsub MakeFood; break; case 4: break; } MakeFood: if (fruits in inventary <= 1){ //fruta nao encontrada (ou mais que 1.) mes .NpcName$; mes "Oh... desculpe..."; mes "quando você tiver 2 ou mais frutas iguais"; mes "volte aqui."; close; } mes .NpcName$; mes "Estas são suas frutas.; mes "Qual você gostaria de trocar"; menu("@item_name+ @quantity, @item_name+ @quantity, @item_name+ @quantitye"); //menu com as frutas que o player tem //é preciso um for para criar este menu? mes "Você escolheu a " + @item_name + ", nos podemos continuar?"; if(select("Sim, podemos!:Nao...melhor nao...") == 2){ mes .NpcName$; mes "Ok, até mais."; close; } if(checkweight is 90%){ //checa se a bagagem esta acima do peso mes .NpcName$; mes "Você está carregando muito peso.."; mes "desculpe."; close; } mes .NpcName$; mes "Pronto.; mes "Ai está seu novo alimento!"; del item: @item_id_old,2; //deleta o alimento antigo set item: @item_id_new; //entrega novo alimento return;
  16. complicado, mas da pra vc pegar todos os ids de items que tem finalidade de curar e exportar somente eles, e usando o próprio editor de txt vc alterar coisas para ser aplicado a todos, já q o maior problema é pegar os ids.
  17. Olha isso com certeza só seria possível com edição na src kk ainda não tenho experiência nisso, porem oq vc pode fazer é o seguinte, nas informações da carta quando vc clicka pra saber oq ela faz, vc adiciona essa informação que se equipar mais de uma dessa carta o player não vai conseguir usar o item no qual está com as cartas, dai, lá no script da carta (item_db, porem na coluna OnEquip) você adiciona uma função (callfunc) e cria uma função (npc) para verificar se existem mais de 1 carta da mesma equipado no item, assim se tiver o script desequipa o item e avisa que o item não pode ser usado e tals..
  18. Conte-me com mais detalhes específicos para que eu possa te ajudar
  19. Hm entendi. Vou verificar a possibilidade. Obrigado.
  20. Última semana
  21. É como eu disse, tem que add na Source o comando...
  22. Olá galera queria saber se tem como eu fazer algo para que nao possa equipar 2 cartas iguais em um item exemplo pode se colocar 4 general tartaruga em uma arma queria que so pudesse por 1 e quando tentasse equipar a outra aparece algo tipo "você so pode equipar 1 carta general tartaruga por item." se alguem saber fazer isso ou se tiver uma ideia sobre o que fazer por favor ajude-me.
  23. Opa, perdão amigo. addrid mesmo, falei tudo errado foi mal. Eu tentei o addrid e não deu: script error in file 'npc/personalizados/xxx.txt' line 12 column 2 parse_line: faltando nome da funcao ou chamando uma funcao indefinida 9: end; 10: 11: OnTouch: * 12: addrid(1); Esse comando sempre retorna isso. Já tentei: addrid 1 addrid(1) addrid,1 Nenhuma alternativa funciona, todos dão erro de compilação. Nos exemplos que eu encontrei do rathena eles utilizam addrid(1) mesmo... Já aqui na ultima rev do brathena não funciona.
  24. CURRÍCULO

    Meu github fala por mim
  25. O attachrid existe no brA, porém o comando que você quer realmente é o addrid () .... Ou vc aplica ele na Source ou muda de emulador... Agora se tiver outra solução, não sei dizer no momento .
  26. Olá, estou tentando fazer um npc que vou precisar verificar a posição de todos os jogadores em um mapa. Minha única ideia para fazer isso é jogar todos os jogadores em um array e percorrer esse array com um for. Pesquisei maneiras de fazer isso, e encontrei o attrid(1). Um comando do rathena que retorna uma lista com todos os jogadores do mapa. Entretanto não consigo utilizar essa função no brathena. Será que foi removida em alguma rev ou não foi criada no brathena? Alguém tem alguma ideia de como posso verificar a posição de todos do mapa para fazer um script se alguém estiver em um local incorreto do mapa? Obrigado.
  27. Opa, estou tentando fazer um pvp sem itens de cura. Pesquisei e encontrei essa resposta do mihael. Funcionou perfeitamente para mim. Entretanto queria fazer isso para todos os consumiveis ou pelo menos ITENS DE CURA. Não encontrei em nenhum lugar como faz. Dei uma query no sql de itens onde usam cura, e existem 375+- itens que curam o usuário. É inviável configurar isso manualmente um por um xd Lembro-me em meados de 2012 em outro emulador que isso funcionava por grupos de item. Por exemplo, na map_zone eu setava exatamente igual setei com o Yggdrasil, porém ao invés de colocar um item, colocava "Healitems" ou coisa do tipo, não me lembro bem. Tem alguma função assim no brathena? Obrigado.
  1. Mais Resultados